2012-07-12 7 views
5

私はC#WinFormを使用しています。それには十数個のテキストボックス、コンボボックス、チェックボックスがあります。 winformは、データベースから取得した情報を表示します。無効になっているフォームに保存ボタンがあります。テキストボックス/コンボボックス/チェックボックスのいずれかが変更されたときに有効にしたい。フォーム内にテキストボックス、コンボボックスなどが変更された場合はいつでもイベントが発生します。

これらのアイテムのそれぞれに別々のイベントハンドラを追加しなければ簡単にこれを行う方法はありますか?

+0

が重複する可能性[C#でフォームの任意のコントロールの変化を検出するには?](http://stackoverflow.com/questions/3571722/how-to-detect-changes-in-any-control -of-the-form-in-c) –

+0

このようにプログラムするのは本当に意味がありません。ユーザーが何かを確認してからもう一度チェックを外すと、もう一度ボタンを無効にする予定ですか?結局のところ、何も変わっていない。 – LarsTech

答えて

5

ここであなたを見つめるには十分です。必要に応じて、他のcontrolタイプのために余分にforeachループを追加する必要があります。いいことは、このアプローチでは、インスタンスごとではなく、Controlタイプごとに数行のコードしか必要でないことです。

private void addHandlers() 
{ 
    foreach (TextBox control in Controls.OfType<TextBox>()) 
    { 
     control.TextChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (ComboBox control in Controls.OfType<ComboBox>()) 
    { 
     control.SelectedIndexChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (CheckBox control in Controls.OfType<CheckBox>()) 
    { 
     control.CheckedChanged += new EventHandler(OnContentChanged); 
    } 
} 

protected void OnContentChanged(object sender, EventArgs e) 
{ 
    if (ContentChanged != null) 
     ContentChanged(this, new EventArgs()); 
} 

public event EventHandler ContentChanged; 

あなたのすべてのコントロールをサポートするためにaddHandlers方法を変更して、フォームにコントロールのすべてを追加した後、それを呼び出した後、あなたは、単にいつでも何かに発生する必要があるかもしれません何でも行うためContentChangedイベントを購読することができますフォームが変更されました(つまり、保存ボタンを有効/無効にします)。

+0

+1これまでの最善の答え –

0

すべてのイベントを処理する汎用イベントハンドラを作成できますが、残念ながら、Visual Studioでイベントハンドラを自動生成する方法はありません。

0

すべてのイベントを1つのハンドラに接続して、すべて同じ機能を呼び出させることができます。ブールフラグmbSomethingChanged = trueがあり、保存ボタンを有効にします。ユーザーに保存するよう警告する場合は、フォームの終了時にフラグをチェックします。

2

コントロールを通過し、すべてのコントロールに変更イベントを添付する必要があります。このarticleも同様の状況について議論します。

private void AssignHandlersForControlCollection(
     Control.ControlCollection coll) 
    { 
     foreach (Control c in coll) 
     { 
      if (c is TextBox) 
       (c as TextBox).TextChanged 
       += new EventHandler(SimpleDirtyTracker_TextChanged); 

      if (c is CheckBox) 
       (c as CheckBox).CheckedChanged 
       += new EventHandler(SimpleDirtyTracker_CheckedChanged); 

      // ... apply for other desired input types similarly ... 

      // recurively apply to inner collections 
      if (c.HasChildren) 
       AssignHandlersForControlCollection(c.Controls); 
     } 
    }