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循环迭代子控件了。至少是这个.控件的子控件,大概是窗体。你对“父控件”的理解并不清楚。