2010-04-10 8 views
5

HTML hat einen Eingabetasten-Typ, um alle Felder in einem Formular in einem Schritt auf ihren ursprünglichen Zustand zurückzusetzen: <input type="reset" ... />.Wie lösche ich alle Formularfelder von Code-Behind?

Gibt es eine ähnliche einfache Möglichkeit, alle Formularfelder einer aspx Seite von Code-behind zurückzusetzen? Oder müssen alle Steuerungen nacheinander mit TextBox1.Text=string.Empty, TextBox2.Text=string.Empty usw. zurückgesetzt werden?

Vielen Dank im Voraus!

Update:

Kontext ist ein einfacher Kontakt/„Senden Sie uns eine Nachricht“ Seite mit 8 asp: Textfelder auf der Seite (in dem der Benutzer den Namen, die Adresse, Telefonnummer, E-Mail, Nachricht, etc tritt .). Dann klickt er auf submit, der Onclick-Message-Handler in code-behind schickt eine E-Mail an einen Administrator, und alle Formularfelder, die der Benutzer ausgefüllt hat, sollten geleert werden und er erhält eine Benachrichtigung in einem Label ("Nachricht gesendet blabla ...")). Ich möchte, dass die Formularfelder gelöscht werden, um zu vermeiden, dass der Benutzer erneut auf "Senden" klickt und die gleiche Nachricht ein zweites Mal gesendet wird.

+1

Je nachdem, was das Szenario ist, könnte es mehr Möglichkeiten, sie zu löschen. Können Sie erklären, wie dies in Ihrem Szenario funktionieren soll? –

+0

@Mikael Svenson: Ich habe ein "Update" zu meiner Frage hinzugefügt, um Ihre Frage zu beantworten. Hoffe, das macht die Dinge klarer. – Slauma

+0

In diesem Fall schlage ich vor, den Viewstate für die Steuerelemente zu deaktivieren, die Sie löschen möchten, wie ich in meiner Antwort geschrieben habe. –

Antwort

11

Sie müssen für jeden Steuerungstyp nur eine Verzweigung schreiben, es sei denn, eine der Steuerungen hat etwas Spezielles, das ausgeführt werden muss, um sie zurückzusetzen.

foreach(var control in this.Controls) 
{ 
    var textbox = control as TextBox; 
    if (textbox != null) 
     textbox.Text = string.Empty; 

    var dropDownList = control as DropDownList; 
    if (dropDownList != null) 
     dropDownList.SelectedIndex = 0; 
    ... 
} 

ADDITION Sie gefragt, wie Kontrollen auch diejenigen zu löschen, die begraben sind. Um das zu tun, sollten Sie eine rekursive Routine wie so erstellen:

private void ClearControl(Control control) 
{ 
    var textbox = control as TextBox; 
    if (textbox != null) 
     textbox.Text = string.Empty; 

    var dropDownList = control as DropDownList; 
    if (dropDownList != null) 
     dropDownList.SelectedIndex = 0; 
    ... 

    foreach(Control childControl in control.Controls) 
    { 
     ClearControl(childControl); 
    } 
} 

Also, würden Sie diese aufrufen, indem Sie die Seite vorbei:

ClearControls(this); 
+0

Sie sollten wahrscheinlich eine Rekursion einbeziehen, wenn Sie über Datenbindungen, Steuerelemente in Vorlagen und benutzerdefinierte Steuerelemente verfügen. –

+0

Schöne einfache Sache! (wird in meinem Fall besonders einfach sein, da ich nur TextBoxen auf der Seite habe). Vielen Dank! – Slauma

+0

Es gibt ein Problem: Meine TextBoxen sind innerhalb des 'Content' -Elements für einen' ContentPlaceHolder', weil meine Seite von einer MasterPage abgeleitet ist. Die 'this.Controls'-Sammlung enthält nur ein Element, das die MasterPage selbst (oder etwas, das davon abgeleitet ist) mit der 'ID = ctl00' enthält. Ich habe im Debugger gesucht, kann aber keine Sammlung von Objekten finden, die meine TextBoxen repräsentieren. – Slauma

1

Für Ihr Szenario der einfachste Weg, um die Felder zu löschen, in Meiner Meinung nach, deaktivieren Sie den ViewState (EnableViewState=false) der Steuerelemente, die nach dem Senden leer angezeigt werden sollen.

Oder vielleicht für die ganze Seite, es sei denn, es gibt einen Zustand, den Sie brauchen.

+0

Hm, ich habe es gerade getestet (für eine der TextBoxen und auch die Option, den ViewState der ganzen Seite abzuschalten). Aber es funktioniert nicht: Alle TextBoxen sind nach dem Postback noch gefüllt. – Slauma

+0

Wenn Sie ein reguläres Postback (nicht Ajax) mit EnabledViewState = false auf der Seite oder einem Steuerelement ausführen, sollten diese Felder keine Werte enthalten, es sei denn, Sie haben sie irgendwo im Code festgelegt. –

+0

Ich habe eine Testwebsite erstellt (eine TextBox + eine Schaltfläche, EnableViewState = "false" auf Seitenebene und auch für die TextBox): Gleiches Verhalten, Werte in der TextBox werden nach PostBack beibehalten. Ich habe ein wenig gegooglet und fand Erklärungen: 1) http://www.dotnetfunda.com/articles/article760-common-misconception-regarding-viewstate-and-textbox-.aspx und 2) http://geekswithblogs.net /AaronLi/archive/2007/05/20/112615.aspx – Slauma

2

Verwenden form.Controls.Clear() ist nicht so ein guter Ansatz, weil es das gesamte Formular löschen wird und Sie sogar alle Schaltflächen auf dem Formular verlieren.

Stattdessen, wenn Sie nur alle Formularfelder wie Textfelder und Optionsfelder löschen möchten würde ich empfehlen Sie versuchen, die folgenden: Wenn Sie eine Reset-Taste „Button1“ haben, dann klicken Sie auf eine Funktion aufrufen reset();

in der Reset-Funktion:

protected void resetButton_Click(object sender, EventArgs e) 
    { 
     TextBox1.Text=""; //set equal to empty string to all fields 
    } 

Oder auf derselben Seite umleiten, indem die vorherige Seite endet

protected void resetButton_Click(object sender, EventArgs e) 
    { 
     Response.Redirect("~/Test2.aspx", true); 
    } 
3

mit dem manuellen Ansatz String.Empty für jede Textbox oder jedes andere Feld wird mühsam sein, auch mit Response.Redirect(); wird es schwierig sein, eine Bestätigungsmeldung oder ähnliches zu zeigen.Also, bei der Lektüre so viele Blogs Ich habe einen zuverlässigen Ansatz bisher gefunden:

Public void reset(Control control) 
    { 
     foreach (Control x in control.Controls) 
     { 
     if (x is TextBox) 
     { 
      (x as TextBox).Text = String.Empty; 
     } 
     if (x is DropDownList) 
     { 
      (x as DropDownList).SelectedIndex = 0; 
     } 
     . 
     . 
     reset(x); 
     } 
    } 

Verwendung dieser Code als reset(this); auf Ihrer Seite, wo Sie wollen die Werte zurücksetzen oder zu löschen. Am Ende der if Bedingungen vergessen Sie nicht, die Funktion rekursiv mit dem gleichen Control Objekt x zu verwenden.

7

Siehe diesen Link für weitere Informationen

http://www.freshcodehub.com/Article/3/clear-all-fields-like-textbox-dropdownlist-checkbox-radiobutton-label-after-form-submission-in-aspnet-c

public void ClearControls(Control parent) 
{ 
    foreach (Control c in parent.Controls) 
    { 
     if ((c.GetType() == typeof(TextBox))) //Clear TextBox 
     { 
      ((TextBox)(c)).Text = ""; 
     } 
     if ((c.GetType() == typeof(DropDownList))) //Clear DropDownList 
     { 
      ((DropDownList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(CheckBox))) //Clear CheckBox 
     { 
      ((CheckBox)(c)).Checked = false; 
     } 
     if ((c.GetType() == typeof(CheckBoxList))) //Clear CheckBoxList 
     { 
      ((CheckBoxList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(RadioButton))) //Clear RadioButton 
     { 
      ((RadioButton)(c)).Checked = false; 
     } 
     if ((c.GetType() == typeof(RadioButtonList))) //Clear RadioButtonList 
     { 
      ((RadioButtonList)(c)).ClearSelection(); 
     } 
     if ((c.GetType() == typeof(HiddenField))) //Clear HiddenField 
     { 
      ((HiddenField)(c)).Value = ""; 
     } 
     if ((c.GetType() == typeof(Label))) //Clear Label 
     { 
      ((Label)(c)).Text = ""; 
     } 
     if (c.HasControls()) 
     { 
      ClearControls(c); 
     } 
    } 
} 
Verwandte Themen