2010-04-13 5 views
5

Vous souhaitez parcourir en boucle toutes les commandes utilisateur présentes sur la page et obtenir leurs ID. Comment fait-on ça?Parcourez toutes les commandes utilisateur sur une page

+0

Est-ce WinForms, WPF ou ASP.NET? Je soupçonne ce dernier, mais on ne sait jamais. – ChrisF

+0

Par "contrôles utilisateur", voulez-vous dire * les contrôles gérés * ou spécifiquement les contrôles utilisateur (.ascx)? – CAbbott

+0

@ChrisF: Vous devinez juste! ASP.Net c'est @ CAbbott: .ascx –

Répondre

11

Pour chaque contrôle utilisateur, vous auriez à tester le type de contrôle:

EDIT: Je modifié mon exemple pour passer par tous les contrôles récursive:

Méthode

public void GetUserControls(ControlCollection controls) 
{ 
    foreach (Control ctl in controls) 
    { 
     if (ctl is UserControl) 
     { 
      // Do whatever. 
     } 

     if (ctl.Controls.Count > 0) 
      GetUserControls(ctl.Controls); 
    } 
} 

appelé

GetUserControls(Page.Controls); 
+0

Nah. Cela ne fonctionne pas –

+1

Qu'est-ce qui ne fonctionne pas à ce sujet? – CAbbott

+0

si (curControl est UserControl) n'est jamais vrai. Et j'ai un contrôle sur la page –

2
foreach(Control control: Page.Controls) 
{ 

    //do something with control object 

} 
+0

Mais alors, il boucle à travers tous les contrôles. Comment un contrôle utilisateur peut-il être différencié? GetType() ?? –

+1

Les contrôles peuvent être imbriqués. Vous avez donc besoin d'une fonction récursive pour parcourir tous les contrôles. –

3

Cela devrait fonctionner:

var listOfUserControls = GetUserControls(Page); 

... 

public List<UserControl> GetUserControls(Control ctrl) 
{ 
    var uCtrls = new List<UserControl>(); 
    foreach (Control child in ctrl.Controls) { 
    if (child is UserControl) uCtrls.Add((UserControl)child); 
    uCtrls.AddRange(GetUserControls(child); 
    } 

    return uCtrls; 
} 
2

J'ai créé une méthode d'extension pour ce faire, ce qui fonctionne vraiment bien avec LINQ.

<Extension()> 
Public Function DecendentControls(ParentControl As Control) As Control() 
    Dim controls As New List(Of Control) 

    For Each myControl As Control In ParentControl.Controls 
     controls.Add(myControl) 
     controls.AddRange(myControl.DecendentControls) 
    Next 

    Return controls.ToArray 
End Function 

Puis, avec LINQ vous pouvez faire quelque chose comme ceci pour définir toutes les cases sur une page sans contrôle:

For Each myControl As CheckBox In pnlMain.DecendentControls.Where(Function(x) TypeOf x Is CheckBox) 
    myControl.Checked = False 
Next 
Questions connexes