2011-12-21 9 views
10

Estoy buscando un ejemplo de código de cómo obtener el control de todos los hijos de padres.¿Cómo conseguir que todos los hijos de un padre controlen?

No tengo ni idea de cómo hacerlo.

foreach (Control control in Controls) 
{ 
    if (control.HasChildren) 
    { 
    ?? 
    } 
} 
+0

Su pregunta no está claro ¿Cómo desea 'obtener' esos controles, dado que ya sabe cómo iterar a través de ellos? –

+0

Ya está iterando a los niños con el ciclo foreach. Al menos los hijos de esto. Controles, presumiblemente la forma. No está claro a qué se refiere con "control de padres". –

Respuesta

15

Si sólo desea los hijos inmediatos, utilice

... 
var children = control.Controls.OfType<Control>(); 
... 

Si desea que todos los controles de la jerarquía (es decir, todo en el árbol bajo un cierto control), utilice:

private IEnumerable<Control> GetControlHierarchy(Control root) 
    { 
     var queue = new Queue<Control>(); 

     queue.Enqueue(root); 

     do 
     { 
      var control = queue.Dequeue(); 

      yield return control; 

      foreach (var child in control.Controls.OfType<Control>()) 
       queue.Enqueue(child); 

     } while (queue.Count > 0); 

    } 

a continuación, se usa algo como esto en una forma:

private void button1_Click(object sender, EventArgs e) 
    { 
     /// get all of the controls in the form's hierarchy in a List<> 
     var controlList = GetControlHierarchy(this).ToList(); 

     foreach (var control in controlList) 
     { 
      /// do something with this control 
     } 
    } 

Tenga en cuenta que .ToList() evaluará todo el Enumerable inmediatamente, lo que elimina cualquier beneficio de rendimiento que pueda obtener de la implementación de coroutine.

4

Los controles tienen una colección MyControl.Controls que se puede hacer en foreach.

Cada control también tiene una propiedad Parent que le proporciona el control principal.

Puede escribir un método recursivo si necesita bajar un número desconocido de niveles.

2

Tal vez podría ser útil para alguien:

public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter) 
{ 
    foreach (Control child in root.Controls) 
    { 
     var childFiltered = filter(child); 
     if (childFiltered != null) AllControls.Add(child); 
     if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter); 
    } 
} 

Ésta es función recursiva para obtener la colección de controles con la posibilidad de appling filtro (por expample por tipo). Y el ejemplo:

List<Control> resultControlList = new List<Control>(); 
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null)); 

Se devolverá todos DropDownLists en rootControl y sus todos los niños

0

Probablemente demasiado complicado, pero utilizando LINQ y algunas ideas de arriba/Otros lugares:

public static IEnumerable<Control> GetAllChildren(this Control root) { 
     var q = new Queue<Control>(root.Controls.Cast<Control>()); 

     while (q.Any()) { 
      var next = q.Dequeue(); 
      next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue); 

      yield return next; 
     } 
    } 
Cuestiones relacionadas