2011-04-06 1 views
0

J'ai besoin d'une fonction récursive qui trouvera tous les contrôles sur une page et permette d'ajouter des attributs de contrôle javascript en fonction du type de contrôle.Recherche récursive des contrôles de page et ajout d'attributs?

Le problème est que j'ai une page avec plusieurs panneaux qui ont des contrôles. Les panneaux pourraient même avoir des panneaux/contrôles imbriqués.

Malheureusement ce qui suit ne fait pas ce que je veux, mais je cherche quelque chose de similaire ....

   Action<Control> traverse = null; 

       //in a function: 
       traverse = (ctrl) => 
       { 
        //ctrl.Enabled = false; //or whatever action you're performing 
        foreach (Control c in ctrl.Controls) 
        { 
         Response.Write(c.GetType().ToString() + " : " + c.ID.ToString() + "<br />"); 

         if (c.GetType() == typeof(TextBox)) 
         { 
          ((TextBox)(c)).Attributes["onKeypress"] = "javascript:return FormEdited();"; 
         } 
         else if (c.GetType() == typeof(DropDownList)) 
         { 
          ((DropDownList)(c)).Attributes["onchange"] = "javascript:return FormEdited();"; 
         } 
         else if (c.GetType() == typeof(CheckBox)) 
         { 
          ((CheckBox)(c)).Attributes["onClick"] = "javascript:return FormEdited();"; 
         } 

        } 

        traverse = (ctrl2) => ctrl.Controls.GetEnumerator(); 
       }; 

Répondre

2

Cela devrait fonctionner:

public void traverse(Control ctl) 
{ 
    foreach (Control c in ctl.Controls) 
    { 
     System.Diagnostics.Debug.WriteLine(c.GetType().ToString()); 
     //Response.Write(c.GetType().ToString() + " : " + c.ID.ToString() + "<br />"); 
     if (c.GetType() == typeof(TextBox)) 
     { ((TextBox)(c)).Attributes["onKeypress"] = "javascript:return FormEdited();"; 
     } 
     if (c.GetType() == typeof(DropDownList)) 
     { ((DropDownList)(c)).Attributes["onchange"] = "javascript:return FormEdited();"; 
     } 
     else if (c.GetType() == typeof(CheckBox)) 
     { ((CheckBox)(c)).Attributes["onClick"] = "javascript:return FormEdited();"; 
     } 
     traverse(c); 
    } 
} 

puis appelez avec :

traverse(this.Page); 

-à-dire

protected void Page_Load(object sender, EventArgs e) 
{ 
    traverse(this.Page); 
} 
+0

Merci pour votre inscription. Finalement, je suis allé avec une méthode qui utilise Linq pour aplatir tous les contrôles de la page (fonctionne si tous les contrôles sont uniquement nommés), donc je n'ai pas à traverser la hiérarchie. – ElHaix