5

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

これらの各アイテムに個別のイベントハンドラーを追加せずにこれを行う簡単な方法はありますか?

4

4 に答える 4

5

ここであなたをじっと見つめるのに十分です。必要に応じて、他のタイプforeachのループを追加する必要がある場合があります。このアプローチでは、インスタンスごとではなく、タイプcontrolごとに数行のコードしか必要ないのは良いことです。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フォーム上の何かが変更されたときに必要になる可能性のあることを実行するためにイベントをサブスクライブできます(つまり、保存ボタン)。

于 2012-07-12T16:30:35.863 に答える
2

コントロールを確認し、すべてのコントロールに変更イベントをアタッチする必要があります。この記事では、同様の状況について説明します。

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);
      }
  }
于 2012-07-12T16:31:51.653 に答える
0

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

于 2012-07-12T16:28:04.227 に答える
0

すべてのイベントを1つのハンドラーに接続し、それらすべてに同じ関数を呼び出させることができます。そこでは、ブールフラグmbSomethingChanged = trueがあり、保存ボタンが有効になります。保存するようにユーザーに警告する場合は、フォームを閉じるときにフラグを確認します。

于 2012-07-12T16:28:25.040 に答える