我正在寻找一个代码示例如何获得父级控制的所有子级。如何获得父母控制的所有孩子?
我不知道它是怎么做到的。
foreach (Control control in Controls)
{
if (control.HasChildren)
{
??
}
}
我正在寻找一个代码示例如何获得父级控制的所有子级。如何获得父母控制的所有孩子?
我不知道它是怎么做到的。
foreach (Control control in Controls)
{
if (control.HasChildren)
{
??
}
}
如果只想眼前的孩子,使用
...
var children = control.Controls.OfType<Control>();
...
如果你想从层次结构(即,一切都在树一定的控制之下),使用的所有控件:
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 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
。
每个控件也有一个Parent
属性,它给你父控件。
如果您需要降低未知数量的级别,则可以编写递归方法。
也许这可能对别人有用:
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);
}
}
这是递归函数来获取控件的集合与(按类型expample)底肥过滤器的可能性。而例如:
List<Control> resultControlList = new List<Control>();
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is 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;
}
}
你的问题不清楚。你想如何“获得”这些控件,看看你已经知道如何遍历它们? – 2011-12-21 19:51:44
您已经在使用foreach循环迭代子项。至少这个孩子。控制,大概是形式。 “父母控制”的含义并不明确。 – 2011-12-21 19:54:01