2010-04-13 16 views
5

Desea recorrer todos los controles de usuario que existen en la página y obtener sus ID. ¿Cómo lo hago?Pasa por todos los controles de usuario en una página

+0

¿Es esta WinForms, WPF o ASP.NET? Sospecho que esto último, pero nunca se sabe. – ChrisF

+0

Por "controles de usuario" ¿quiere decir * controles gestionados * o específicamente controles de usuario (.ascx)? – CAbbott

+0

@ChrisF: ¡Adivinas bien! ASP.Net es @CAbbott: .ascx –

Respuesta

11

Para obtener cada control de usuario, que lo tienes que probar el tipo de control:

EDIT: he modificado mi ejemplo que pasar por todos los controles de forma recursiva:

Método

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

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

Llamado

GetUserControls(Page.Controls); 
+0

Nah. Eso no funciona –

+1

¿Qué no funciona al respecto? – CAbbott

+0

if (curControl es UserControl) nunca es verdadero. Y tengo un usercontrol en la página –

2
foreach(Control control: Page.Controls) 
{ 

    //do something with control object 

} 
+0

Pero luego, pasa por todos los controles. ¿Cómo se puede diferenciar un control de usuario? GetType() ?? –

+1

Los controles se pueden anidar, por lo que necesita una función recursiva para recorrer todos los controles. –

3

Esto debería funcionar:

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

creé un método de extensión para hacer esto, que funciona muy bien con 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 

Luego, con LINQ se puede hacer algo como esto para establecer todas las casillas en una página y no marcado:

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