Comment obtenir tous les enfants d’un contrôle parental?

Je cherche un exemple de code pour obtenir tous les enfants du contrôle parental.

Je ne sais pas comment faire.

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

Si vous ne voulez que les enfants immédiats, utilisez

 ... var children = control.Controls.OfType(); ... 

Si vous voulez que tous les contrôles de la hiérarchie (c’est-à-dire tout ce qui est dans l’arborescence sous un certain contrôle), utilisez:

  private IEnumerable GetControlHierarchy(Control root) { var queue = new Queue(); queue.Enqueue(root); do { var control = queue.Dequeue(); yield return control; foreach (var child in control.Controls.OfType()) queue.Enqueue(child); } while (queue.Count > 0); } 

Ensuite, vous pourriez utiliser quelque chose comme ceci dans un formulaire:

  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 } } 

Notez que .ToList() évaluera immédiatement la totalité de Enumerable, ce qui éliminera tout avantage en termes de performances que vous pourriez tirer de la mise en oeuvre de la coroutine.

Les contrôles ont une collection MyControl.Controls laquelle vous pouvez effectuer un foreach .

Chaque contrôle a également une propriété Parent qui vous donne le contrôle parent.

Vous pouvez écrire une méthode récursive si vous devez descendre un nombre inconnu de niveaux.

Peut-être que cela pourrait être utile pour quelqu’un:

 public void GetControlsCollection(Control root,ref List AllControls, Func 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); } } 

C’est une fonction récursive pour obtenir la collection de contrôles avec la possibilité d’appliquer un filtre (pour un exemple par type). Et l’exemple:

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

Il renverra toutes les listes déroulantes dans rootControl et ses tous les enfants

Probablement trop compliqué, mais en utilisant Linq et quelques idées d’en haut / d’autres lieux:

  public static IEnumerable GetAllChildren(this Control root) { var q = new Queue(root.Controls.Cast()); while (q.Any()) { var next = q.Dequeue(); next.Controls.Cast().ToList().ForEach(q.Enqueue); yield return next; } }