2010-11-03 4 views
7

J'ai 2 méthodes que j'ai essayé d'itérer dans toutes mes zones de texte dans une page asp.net. Le premier fonctionne, mais le second ne retourne rien. Quelqu'un pourrait-il m'expliquer pourquoi le second ne fonctionne pas?itération à travers les TextBox dans asp.net - pourquoi cela ne fonctionne-t-il pas?

Cela fonctionne bien:

List<string> list = new List<string>(); 

    foreach (Control c in Page.Controls) 
    { 
     foreach (Control childc in c.Controls) 
     { 
      if (childc is TextBox) 
      { 
       list.Add(((TextBox)childc).Text); 
      } 
     } 
    } 

et « ne fonctionne pas » Code:

List<string> list = new List<string>(); 

    foreach (Control control in Controls) 
    { 
     TextBox textBox = control as TextBox; 
     if (textBox != null) 
     { 
      list.Add(textBox.Text); 
     } 
    } 
+0

Dans le deuxième lot de code, Controls contient-il même quelque chose? – brumScouse

Répondre

9

Votre premier exemple est en train de faire un niveau de récursivité, de sorte que vous obtenez TextBoxes qui sont plus un contrôle au plus profond de l'arbre de contrôle. Le deuxième exemple obtient uniquement TextBoxes de niveau supérieur (dont vous avez probablement peu ou aucun).

La clé ici est que la collection Controls ne sont pas tous les contrôles sur la page - plutôt, il est seulement le contrôle enfant immédiat du contrôle actuel (et un Page est un type de Control). Ces contrôles peuvent à leur tour avoir leurs propres contrôles enfants. Pour en savoir plus à ce sujet, lire sur le ASP.NET Control Tree here et sur NamingContainers here. Pour vraiment obtenir tous les TextBox partout sur la page, vous avez besoin d'une méthode récursive, comme ceci:

public static IEnumerable<T> FindControls<T>(this Control control, bool recurse) where T : Control 
{ 
    List<T> found = new List<T>(); 
    Action<Control> search = null; 
    search = ctrl => 
     { 
      foreach (Control child in ctrl.Controls) 
      { 
       if (typeof(T).IsAssignableFrom(child.GetType())) 
       { 
        found.Add((T)child); 
       } 
       if (recurse) 
       { 
        search(child); 
       } 
      } 
     }; 
    search(control); 
    return found; 
} 

qui est utilisé comme extension method, comme ceci:

var allTextBoxes = this.Page.FindControls<TextBox>(true); 
+0

Ok, mais que voulez-vous dire par TextBoxes de niveau supérieur? Mes zones de texte sont simplement des zones de texte "normales" dans un formulaire. –

+0

@Svein voir ma réponse mise à jour. Votre formulaire Web est un arbre de contrôles - contrôles qui contiennent des contrôles qui contiennent des contrôles, et ainsi de suite. Le «niveau supérieur» désigne les contrôles qui se trouvent au sommet ou au niveau le plus élevé de la hiérarchie. –

+0

Merci beaucoup pour l'explication détaillée et l'exemple de code! J'aime Stackoverflow, tant de gens formidables qui veulent aider les autres :-) –

1

Vous devez récursif. Les contrôles sont dans une structure arborescente - Page.Controls n'est pas une liste aplatie de tous les contrôles de la page. Vous auriez besoin de faire quelque chose comme ce qui suit pour obtenir toutes les valeurs de TextBoxes:

void GetTextBoxValues(Control c, List<string> strings) 
{ 
    TextBox t = c as TextBox; 
    if (t != null) 
     strings.Add(t.Text); 

    foreach(Control child in c.Controls) 
     GetTextBoxValues(child, strings); 
} 

...

List<string> strings = new List<string>(); 
GetTextBoxValues(Page, strings); 
0

vous pouvez essayer ce morceau de code pour obtenir la liste de tous les TextBoxes

public partial class _Default : System.Web.UI.Page 
    { 

     public List<TextBox> ListOfTextBoxes = new List<TextBox>(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      // after execution this line 
      FindTextBoxes(Page, ListOfTextBoxes); 
      //ListOfTextBoxes will be populated with all text boxes with in the page. 

     } 


     private void FindTextBoxes(Control Parent, List<TextBox> ListOfTextBoxes) 
     { 
      foreach (Control c in Parent.Controls) { 
       // if c is a parent control like panel 
       if (c.HasControls()) 
       { 
        // search all control inside the panel 
        FindTextBoxes(c, ListOfTextBoxes); 
       } 
       else { 
        if (c is TextBox) 
        { 
         // if c is type of textbox then put it into the list 
         ListOfTextBoxes.Add(c as TextBox); 
        } 
       } 
      } 
     } 
    } 
+0

Je vous ai déjà informé de la possibilité de créer un lien vers votre propre site Web sans attribution. –

Questions connexes