Reputation: 17427
I'm looking for an code example how to get all children of parent control.
I have no idea how do it.
foreach (Control control in Controls)
{
if (control.HasChildren)
{
??
}
}
Upvotes: 15
Views: 30979
Reputation: 588
Here's a concise recursive extension function using Linq:
/// <summary>
/// Recursive function to get all descendant controls.
/// </summary>
public static IEnumerable<Control> GetDescendants(this Control control)
{
var children = control.Controls.Cast<Control>();
return children.Concat(children.SelectMany(c => GetDescendants(c)));
}
Upvotes: 1
Reputation: 26917
Probably overly complicated, but using Linq and some ideas from above / other places:
public static IEnumerable<Control> GetAllChildren(this Control root) {
var q = new Queue<Control>(root.Controls.Cast<Control>());
while (q.Any()) {
var next = q.Dequeue();
foreach (Control c in next.Controls)
q.Enqueue(c);
yield return next;
}
}
Upvotes: 1
Reputation: 29051
If you only want the immediate children, use
...
var children = control.Controls.OfType<Control>();
...
If you want all controls from the hierarchy (ie, everything in the tree under a certain control), use a pretty simple data-recursive method:
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);
}
Then, you might use something like this in a form:
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
}
}
Upvotes: 26
Reputation: 8937
Maybe it could be useful for someone:
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);
}
}
This is recursive function to get the collection of controls with the possibility of appling filter (for expample by type). And the example:
List<Control> resultControlList = new List<Control>();
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null ));
It will return all DropDownLists in rootControl and his all children
Upvotes: 2
Reputation: 3401
Controls have a MyControl.Controls
collection which you can do a foreach
on.
Each Control also has a Parent
property which gives you the parent control.
You can write a recursive method if you need to go down an unknown number of levels.
Upvotes: 4