あなたの編集に従って、私はあなたが望む機能を含むように私の答えを修正しました。
まず、次のような汎用イベントハンドラーが必要です。
void MyHandler(object obj, EventArgs e)
{
button1.Enabled = true;
}
ここで、button1は有効にするボタンです。
Form.Controls
次に、を反復処理するだけでなく、そこに含まれるコンテナタイプのコントロールも再帰的に実行する必要があります。いくつかの一般的なコンテナコントロールといくつかの基本的なデータ入力コントロールの処理を含めました。
void AddEvents(System.Windows.Forms.Control.ControlCollection Controls)
{
foreach (Control c in Controls)
{
if (c is GroupBox)
{
AddEvents(((GroupBox)c).Controls);
}
else if (c is Panel)
{
AddEvents(((Panel)c).Controls);
}
//Expand this series of if...else... to include any
//other type of container control
else if (c is TextBox)
{
((TextBox)c).TextChanged += new EventHandler(MyHandler);
}
else if (c is RichTextBox)
{
((RichTextBox)c).TextChanged += new EventHandler(MyHandler);
}
else if (c is CheckBox)
{
((CheckBox)c).CheckedChanged += new EventHandler(MyHandler);
}
else if (c is DateTimePicker)
{
((DateTimePicker)c).ValueChanged += new EventHandler(MyHandler);
}
//Expand this to include any other type of controls your form
//has that you need to add the event to
}
}
ブロックの最初の部分は、が他のコントロールを含むタイプであるif else
かどうかを確認します。control
そうである場合は、その中に含まれているnewを使用してAddEventsメソッドを再帰的に呼び出します。System.Windows.Forms.Control.ControlCollection
control
ブロックの2番目の部分は、if else
コントロールcのタイプをチェックして、正しいタイプに適切にキャストできるようにし、正しいイベントを利用できるようにします。この時点でコントロールタイプを判別できる場合は、前に作成した汎用イベントがハンドラーとして追加されます。
最後に、このメソッドを呼び出す必要があります。2つの最適な場所は、おそらくコンストラクターまたはForm.Load
イベントのいずれかになります。それを置くのに最適な場所は、特定の状況によって異なります。簡単にするためにコンストラクターを使用することにしました。これは次のようになります。
public Form1()
{
InitializeComponent();
AddEvents(this.Controls);
}
コントロールを繰り返し、汎用イベントハンドラーを追加するために必要なのはこれだけです。このコードは、私が作成した実際のプロジェクトからのものであり、適切な機能であることを確認するためにテストしました。
編集:私はまた、上にあるの内側の内側の内側の内側のsを使用してこれをテストしcontrol
ました。ここで、再帰を利用することの有用性が出てきます。ブロックを適切に設定している限り、ネストの正確な深さを知る必要はありません。ネストされたループを使用したり、正確な深さを知らなくても、必要なだけ深くなります。GroupBox
Panel
GroupBox
Panel
Form
if...else...
EDIT2:補足として、このメソッドはより詳細なレベルでも使用できます。複数のGroupBox
コントロールがあり、「grpBox1」のコントロールにのみイベントハンドラーを追加したいとします。AddEvents(grpBox1.Controls)
の代わりにを呼び出すことができます。AddEvents(this.Controls)
これは、に含まれるコントロールにのみイベントハンドラーを適用しますgrpBox1
。
EDIT3: onemancatがコメントで指摘しているように、すべてのコントロールはプロパティを持つ基本クラスから継承するため、コントロールがaGroupBox
またはなどであるかどうかを実際に確認する必要はありません。を言うことで他のコントロールが含まれているかどうかを簡単に確認できますが、反復するコンテナコントロールを選択したい状況では、私の例のようにタイプを確認する必要があります。このように細かくする必要がない場合は、カウントをチェックする方が理にかなっており、タイプチェックやキャストに煩わされることはありません。Panel
Control
Controls
Control
if (c.Controls.Count > 0) AddEvents(c.Controls);