フォームとコンテナー コントロールの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;
}
});