web-dev-qa-db-ja.com

ユーザークリックからのみcomboBox SelectedIndexChangedを発火させる

ComboBoxのSelectedIndexChangedイベントを処理するメソッドを記述しました。

コンストラクターでは、comboBoxにデータを入力しました。これにより、イベント処理メソッドがアクティブになりました。誰もcomboBoxをクリックしなかったので、これは望ましくありません。

ユーザーがクリックしない限り、comboBoxがイベントを発生させないようにする簡単な方法はありますか?

それが不可能な場合、メソッドへのイベントを一時的に切断する方法はありますか? "my_combo.SelectedIndexChanged = null"を設定して、新しいSystem.EventHandlerを作成できますか?

または、オンまたはオフに切り替えてメソッドにブランチチェックを配置できる、ある種類のブールメンバー変数を作成できると思います。でもそれはクラッジのようです。

18
micahhoover

提案した両方の方法を使用できます。

  1. ブール変数を使用する
  2. イベントメソッドをデタッチし、コンボボックスにデータを追加し、次のようにイベントメソッドをアタッチします。

    my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
    populateCombo();
    
    my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
    

my_Combo_SelectedIndexChangedは、イベントにアタッチしたメソッドの名前です。

9
Filip Popović

私は何度もそれをしました。解決策1:デザイナーからEventHandlerを削除します。コンボボックスに入力してから、EventHandlerを設定します。

Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;

ただし、コンボボックスに1度入力している場合にのみ機能します。何度も入力していると、混乱する可能性があります。

Solution2:それは私の好みで、私はそれを定期的に使用しています。選択変更イベントを次のように変更します。

private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox cb = (ComboBox)sender;
   if(!cb.Focused)
   {
      return;
   }
   // Here is your Code for selection change
}

そのため、イベントがフォーカスされている場合にのみイベントが発生します。あなたが同じものを探していたことを願っています。それが役に立てば幸い

32
Sandy

これが現在使用されているかどうかはわかりませんが、 この答え を見つけました。

MSDNライブラリから-ComboBox.SelectionChangeCommittedイベント

"SelectionChangeCommittedは、ユーザーがコンボボックスの選択を変更したときにのみ発生します。 SelectedIndexChanged または SelectedValueChanged ユーザーの変更をキャプチャします。これらのイベントは、選択がプログラムによって変更されたときにも発生するためです。」

30
Lankymart

他のブール値を作成する代わりに、control.ContainsFocusを使用します。ここでの注意点は、ユーザーがそのコントロールに集中できるようにする必要があることです。キーまたはマウスによる。

if(combo.ContainsFocus){ MyEventLogic();}
4
TatiOverflow
  1. 解決策:コンボボックスに静的な値のみを入力する場合は、それらに値を入力し、afterコードからイベントにサブスクライブします。 WinForms Designerを使用してサブスクライブしないでください。
  2. ロード中にそれができない場合は、次のことができます。

    a)ブール変数bool loadingを定義し、コンボにデータを入力し始める前にtrueに設定し、イベントハンドラーチェックで

    if(loading)return;

    b)イベントの登録を解除:

    サブスクリプションが:

    comboBox.SelectedIndexChanged + = delegate(...);

    データの読み込みを開始する前のサブスクリプション解除は次のとおりです。

    comboBox.SelectedIndexChanged-= delegate(...);

データの読み込みが完了したら、再度購読してください。

2
Tigran