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;
}
});
再帰的ループで実行できます。 – jac