如何让父母控制的所有孩子?

我正在寻找一个代码示例,如何获得父控件的所有子代。

我不知道怎么做。

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

如果您只想要直系孩子,请使用

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

如果您想要层次结构中的所有控件(即树中某些控件下的所有控件),请使用:

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

然后,您可以在表单中使用以下内容:

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

请注意.ToList()将立即评估整个Enumerable,这消除了您从协程实现中获得的任何性能优势。

控件有一个MyControl.Controls集合,你可以做一个foreach

每个Control还有一个Parent属性,它为您提供父控件。

如果需要降低未知数量的级别,可以编写递归方法。

也许它可能对某人有用:

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

这是递归函数,用于获取可能应用filter的控件集合(按类型进行示例)。 而这个例子:

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

它将返回rootControl中的所有DropDownLists及其所有子节点

可能过于复杂,但使用Linq和来自上面/其他地方的一些想法:

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