2010-04-10 4 views
5

HTML a un type de bouton d'entrée pour réinitialiser tous les champs d'un formulaire à leur état initial en une seule étape: <input type="reset" ... />.Comment effacer tous les champs de formulaire du code-behind?

Existe-t-il un moyen similaire simple de réinitialiser tous les champs de formulaire d'une page aspx à partir de code-behind? Ou est-il nécessaire de réinitialiser toutes les commandes une par une avec TextBox1.Text=string.Empty, TextBox2.Text=string.Empty, etc.?

Merci d'avance!

Mise à jour:

Le contexte est un simple contact/page "Envoyez-nous un message" avec 8 asp: TextBox sur la page (où l'utilisateur entre le nom, adresse, téléphone, e-mail, message, etc. .). Puis il clique sur submit, le gestionnaire de message Onclick dans code-behind envoie un email à un administrateur, et tous les champs de formulaire remplis par l'utilisateur doivent être vidés et il reçoit une notification dans un label ("Message envoyé blabla ..."). Je souhaite que les champs de formulaire soient effacés pour éviter que l'utilisateur ne clique à nouveau sur soumettre et que le même message soit envoyé une seconde fois.

+1

Selon ce que le scénario est, il pourrait y avoir plusieurs façons de les effacer. Pourriez-vous expliquer comment vous voulez que cela fonctionne dans votre scénario? –

+0

@Mikael Svenson: J'ai ajouté une "Mise à jour" à ma question pour répondre à votre question. J'espère que cela rend les choses plus claires. – Slauma

+0

Dans ce cas, je propose d'éteindre le viewstate pour les contrôles que vous souhaitez effacer comme je l'ai écrit dans ma réponse. –

Répondre

11

Il suffit d'écrire une fourchette pour chaque type de contrôle sauf si l'un des contrôles a quelque chose de spécial qui doit être fait pour le réinitialiser.

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; 
    ... 
} 

AJOUT Vous avez demandé comment effacer les contrôles, même ceux qui sont inhumés. Pour ce faire, vous devez créer une routine récursive comme ceci:

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); 
    } 
} 

Donc, vous appelez cela en passant la page:

ClearControls(this); 
+0

Vous devriez probablement inclure une certaine récursivité si vous avez des connexions de données, des contrôles à l'intérieur de modèles et des contrôles personnalisés. –

+0

Belle chose simple! (sera particulièrement simple dans mon cas puisque je n'ai que des TextBox sur la page). Je vous remercie! – Slauma

+0

Il y a un problème: Mes zones de texte se trouvent à l'intérieur de l'élément 'Content' pour ContentPlaceHolder, car ma page est dérivée d'une page MasterPage. La collection 'this.Controls' contient seulement un élément qui est la MasterPage elle-même (ou quelque chose qui en dérive) avec le' ID = ctl00'. Je cherchais dans le débogueur mais je ne trouve aucune collection d'objets représentant mes TextBox. – Slauma

1

Pour votre scénario, la meilleure façon d'effacer les champs, mon avis, est d'éteindre le ViewState (EnableViewState=false) des contrôles que vous voulez apparaître vide après l'envoi.

Ou peut-être pour toute la page sauf si vous avez besoin d'un état.

+0

Hm, je viens de le tester (pour l'une des TextBoxes et aussi l'option pour désactiver ViewState de la page entière). Mais cela ne fonctionne pas: tous les TextBox sont encore remplis après la publication. – Slauma

+0

Si vous effectuez une publication régulière (pas ajax) avec EnabledViewState = false sur la page ou sur un contrôle, ces champs ne devraient en aucun cas avoir des valeurs, sauf si vous les avez définis dans un code quelque part. –

+0

J'ai créé un site web de test (un TextBox + un Button, EnableViewState = "false" au niveau de la page et aussi pour le TextBox): Même comportement, les valeurs dans le TextBox sont conservées après PostBack. J'ai googlé un peu et trouvé des explications: 1) http://www.dotnetfunda.com/articles/article760-common-misconception-regarding-viewstate-and-textbox-.aspx et 2) http://geekswithblogs.net /AaronLi/archive/2007/05/20/112615.aspx – Slauma

2

L'utilisation de form.Controls.Clear() n'est pas une bonne approche car elle efface tout le formulaire et vous risquez même de perdre tous les boutons du formulaire.

Au lieu de cela si vous voulez juste pour effacer tous les champs de formulaire comme les champs de texte et des boutons radio, je vous conseille d'essayer ce qui suit: Si vous avez un bouton de réinitialisation « Button1 » puis cliquez sur appeler une fonction reset();

dans la fonction de remise à zéro:

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

Ou rediriger vers une même page en mettant fin à la page précédente

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

en utilisant l'approche manuelle de String.Empty pour chaque zone de texte ou tout autre champ sera lourd, aussi en utilisant Response.Redirect(); il sera difficile d'afficher un message de confirmation ou même.Ainsi, à la lecture tant de blogs que j'ai trouvé une approche fiable à ce jour:

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); 
     } 
    } 

utiliser ce code comme reset(this); dans la page où vous souhaitez réinitialiser ou effacer les valeurs. À la fin des conditions if n'oubliez pas d'utiliser la fonction récursivement en utilisant le même Control objet x.

7

Référez ce lien pour plus d'informations

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); 
     } 
    } 
} 
Questions connexes