C# 如何获取父控件的所有子控件?

C# 如何获取父控件的所有子控件?,c#,.net,controls,C#,.net,Controls,我正在寻找一个如何获取父控件的所有子控件的代码示例 我不知道怎么做 foreach (Control control in Controls) { if (control.HasChildren) { ?? } } 控件有一个MyControl.Controls集合,您可以在该集合上执行foreach 每个控件还具有一个Parent属性,该属性为您提供父控件 如果需要降低未知的级别数,可以编写递归方法。如果只需要直接子级,请使用 ... var children = con

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

我不知道怎么做

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

控件有一个
MyControl.Controls
集合,您可以在该集合上执行
foreach

每个控件还具有一个
Parent
属性,该属性为您提供父控件


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

如果只需要直接子级,请使用

...
var children = control.Controls.OfType<Control>();
...
。。。
var children=control.Controls.OfType();
...
如果需要层次结构中的所有控件(即,树中的所有控件都在某个控件下),请使用非常简单的数据递归方法:

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

    }
private IEnumerable GetControlHierarchy(控件根)
{
var queue=新队列();
queue.Enqueue(root);
做
{
var control=queue.Dequeue();
收益率控制;
foreach(control.Controls.OfType()中的var child)
排队。排队(子级);
}而(queue.Count>0);
}
然后,您可以在表单中使用类似的内容:

    private void button1_Click(object sender, EventArgs e)
    {
        /// get all of the controls in the form's hierarchy in an IEnumerable<>
        foreach (var control in GetControlHierarchy(this))
        {
            /// do something with this control
        }
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
///在IEnumerable中获取窗体层次结构中的所有控件
foreach(GetControlHierarchy(this))中的var控件
{
///使用此控件执行某些操作
}
}

也许它对某些人有用:

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);
    }
}
public void GetControlsCollection(控件根目录、引用列表所有控件、函数筛选器)
{
foreach(root.Controls中的控件子级)
{
var childFiltered=过滤器(子级);
if(childFiltered!=null)AllControls.Add(child);
if(child.HasControls())GetControlsCollection(child,ref-AllControls,filter);
}
}
这是一个递归函数,用于获取控件集合,并可能应用过滤器(对于expample by type)。举个例子:

 List<Control> resultControlList = new List<Control>();
 GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null ));
List resultControlList=newlist();
GetControlsCollection(rootControl,ref-resultControlList,新函数(ctr=>(ctr是DropDownList)?ctr:null));

它将返回rootControl中的所有DropDownLists和他的所有孩子

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

    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;
        }
    }
public静态IEnumerable GetAllChildren(此控件根){
var q=新队列(root.Controls.Cast());
while(q.Any()){
var next=q.Dequeue();
next.Controls.Cast().ToList().ForEach(q.Enqueue);
其次是收益率;
}
}

下面是一个使用Linq的简明递归扩展函数:

//
///用于获取所有子代控件的递归函数。
/// 
公共静态IEnumerable GetSubstands(此控件)
{
var children=control.Controls.OfType();
return children.Concat(children.SelectMany(c=>getsubstands(c));
}

你的问题不清楚。您希望如何“获取”这些控件,因为您已经知道如何迭代它们了?您已经在使用foreach循环迭代子控件了。至少是这个.控件的子控件,大概是窗体。你对“父控件”的理解并不清楚。