窗体和容器控件的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
form在哪里;您还可以替换this
为必须影响嵌套控件的表单或控件变量:
this.ForAllControls(c =>
{
if (c.GetType() == typeof(TextBox)) {
c.TextChanged += C_TextChanged;
}
});