如何获取特定类型的Windows窗体(Button / Textbox)的所有子控件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我需要在x类型的表单上获得所有控件。我很肯定我曾经看到过这样的代码:

dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

我知道我可以使用递归函数来迭代所有的控件--获取子控件,但是是否有更简单或更简单的方法,比如下面的内容呢?

Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
提问于
用户回答回答于

这是你的另一个选择。我通过创建一个示例应用程序对其进行了测试,然后将GroupBox和GroupBox放在初始的GroupBox中。在嵌套的GroupBox中,我放置了3个TextBox控件和一个按钮。这是我使用的代码

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();

    return controls.SelectMany(ctrl => GetAll(ctrl,type))
                              .Concat(controls)
                              .Where(c => c.GetType() == type);
}

要在表单加载事件中测试它,我需要初始GroupBox中所有控件的计数

private void Form1_Load(object sender, EventArgs e)
{
    var c = GetAll(this,typeof(TextBox));
    MessageBox.Show("Total Controls: " + c.Count());
}

它每次都会返回正确的计数

用户回答回答于

在C#中(因为你标记为这样),你可以使用这样的LINQ表达式:

List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();

递归:

在这个例子中,你首先创建控件列表,然后调用一个方法来填充它。由于该方法是递归的,它不会返回列表,只会更新它。

List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
    foreach (Control c in container.Controls)
    {
        GetAllControls(c);
        if (c is TextBox) ControlList.Add(c);
    }
}

2返回一个集合:

一种简单地返回所需控件的方法可能是更好的做法。为了说明这一点,我修改了代码,如下所示:

private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
    List<Control> controlList = new List<Control>();
    foreach (Control c in container.Controls)
    {
        controlList.AddRange(GetAllTextBoxControls(c));
        if (c is TextBox)
            controlList.Add(c);
    }
    return controlList;
}

扫码关注云+社区