How do I get all controls of a form in Windows Forms?

16,129

Solution 1

With recursion...

public static IEnumerable<T> Descendants<T>( this Control control ) where T : class
{
    foreach (Control child in control.Controls) {

        T childOfT = child as T;
        if (childOfT != null) {
            yield return (T)childOfT;
        }

        if (child.HasChildren) {
            foreach (T descendant in Descendants<T>(child)) {
                yield return descendant;
            }
        }
    }
}

You can use the above function like:

var checkBox = (from c in myForm.Descendants<CheckBox>()
                where c.TabIndex == 9
                select c).FirstOrDefault();

That will get the first CheckBox anywhere within the form that has a TabIndex of 9. You can obviously use whatever criteria you want.

If you aren't a fan of LINQ query syntax, the above could be re-written as:

var checkBox = myForm.Descendants<CheckBox>()
                     .FirstOrDefault(x=>x.TabIndex==9);

Solution 2

Recursively search through your form's Controls collection.

void FindAndSayHi(Control control)
{
    foreach (Control c in control.Controls)
    {
        Find(c.Controls);
        if (c.TabIndex == 9)
        {
            MessageBox.Show("Hi");
        }
    }
}

Solution 3

You can make a method like this:

public static Control GetControl(Control.ControlCollection controlCollection, Predicate<Control> match)
{
    foreach (Control control in controlCollection)
    {
        if (match(control))
        {
            return control;
        }

        if (control.Controls.Count > 0)
        {
            Control result = GetControl(control.Controls, match);
            if (result != null)
            {
                return result;
            }
        }
    }

    return null;
}

...that is used like this:

Control control = GetControl(this.Controls, ctl => ctl.TabIndex == 9);

Note however that TabIndex is a tricky case, since it starts at 0 within each container, so there may be several controls in the same form having the same TabIndex value.

Either way, the method above can be used for checking pretty much any property of the controls:

Control control = GetControl(this.Controls, ctl => ctl.Text == "Some text");

Solution 4

void iterateControls(Control ctrl)
{
    foreach(Control c in ctrl.Controls)
    {
        iterateControls(c);
    }
}
Share:
16,129
Shailesh
Author by

Shailesh

Updated on June 13, 2022

Comments

  • Shailesh
    Shailesh almost 2 years

    I have a Form named A.

    A contains lots of different controls, including a main GroupBox. This GroupBox contains lots of tables and others GroupBoxes. I want to find a control which has e.g. tab index 9 in form A, but I don't know which GroupBox contains this control.

    How can I do this?