循环遍历表单的所有控件,甚至是 GroupBox 中的控件

2023-11-24

我想向我的所有文本框添加一个事件Form:

foreach (Control C in this.Controls)
{
    if (C.GetType() == typeof(System.Windows.Forms.TextBox))
    {
        C.TextChanged += new EventHandler(C_TextChanged);
    }
}

问题是它们存储在多个 GroupBox 中,而我的循环看不到它们。我可以循环遍历每个控件GroupBox单独进行,但是否有可能在一个循环中以一种简单的方式完成这一切?


The Controls表单和容器控件的集合仅包含直接子级。为了获取所有控件,您需要遍历控件树并递归地应用此操作

private void AddTextChangedHandler(Control parent)
{
    foreach (Control c in parent.Controls)
    {
        if (c.GetType() == typeof(TextBox)) {
            c.TextChanged += new EventHandler(C_TextChanged);
        } else {
            AddTextChangedHandler(c);
        }
    }
}

注:该表格(间接)源自Control以及所有控件都有一个Controls收藏。所以你可以在你的表单中调用这样的方法:

AddTextChangedHandler(this);

更通用的解决方案是创建一个扩展方法,将操作递归地应用于所有控件。在静态类中(例如WinFormsExtensions)添加这个方法:

public static void ForAllControls(this Control parent, Action<Control> action)
{
    foreach (Control c in parent.Controls) {
        action(c);
        ForAllControls(c, action);
    }
}

静态类命名空间必须是“可见的”,即添加适当的using声明(如果它位于另一个命名空间中)。

然后你可以这样称呼它,其中this是形式;你也可以更换this通过其嵌套控件必须受到影响的表单或控件变量:

this.ForAllControls(c =>
{
    if (c.GetType() == typeof(TextBox)) {
        c.TextChanged += C_TextChanged;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环遍历表单的所有控件,甚至是 GroupBox 中的控件 的相关文章

随机推荐