首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取特定类型(Button/Textbox)的Windows窗体窗体的所有子控件?

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

Stack Overflow用户
提问于 2010-08-06 05:07:00
回答 24查看 220.8K关注 0票数 129

我需要在一个窗体上获取所有x类型的控件。我非常确定我在过去见过一次使用以下内容的代码:

代码语言:javascript
复制
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

我知道我可以使用递归函数遍历所有获取子控件的控件,但是有没有更简单或更直接的方法,比如下面这样?

代码语言:javascript
复制
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2010-08-07 02:40:19

这是你的另一个选择。我通过创建一个示例应用程序对其进行了测试,然后在初始GroupBox中放置了一个GroupBox和一个GroupBox。在嵌套的GroupBox中,我放置了3个TextBox控件和一个按钮。这就是我使用的代码(甚至包括你正在寻找的递归)

代码语言:javascript
复制
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);
}

为了在form load事件中测试它,我想要一个初始GroupBox内所有控件的计数

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

并且它每次都返回正确的计数,所以我认为这将完美地满足您的需求:)

票数 251
EN

Stack Overflow用户

发布于 2011-07-29 22:23:21

这是递归GetAllControls()的改进版本,它实际上作用于私有变量:

代码语言:javascript
复制
    private void Test()
    {
         List<Control> allTextboxes = GetAllControls(this);
    }
    private List<Control> GetAllControls(Control container, List<Control> list)
    {
        foreach (Control c in container.Controls)
        {
            if (c is TextBox) list.Add(c);
            if (c.Controls.Count > 0)
                list = GetAllControls(c, list);
        }

        return list;
    }
    private List<Control> GetAllControls(Control container)
    {
        return GetAllControls(container, new List<Control>());
    }
票数 14
EN

Stack Overflow用户

发布于 2012-10-16 02:44:48

我将前面的一些想法合并到一个扩展方法中。这样做的好处是,您可以得到类型正确的enumerable,而且继承可以由OfType()正确地处理。

代码语言:javascript
复制
public static IEnumerable<T> FindAllChildrenByType<T>(this Control control)
{
    IEnumerable<Control> controls = control.Controls.Cast<Control>();
    return controls
        .OfType<T>()
        .Concat<T>(controls.SelectMany<Control, T>(ctrl => FindAllChildrenByType<T>(ctrl)));
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3419159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档