ComboBoxのSelectedIndexChangedイベントを処理するメソッドを記述しました。
コンストラクターでは、comboBoxにデータを入力しました。これにより、イベント処理メソッドがアクティブになりました。誰もcomboBoxをクリックしなかったので、これは望ましくありません。
ユーザーがクリックしない限り、comboBoxがイベントを発生させないようにする簡単な方法はありますか?
それが不可能な場合、メソッドへのイベントを一時的に切断する方法はありますか? "my_combo.SelectedIndexChanged = null"を設定して、新しいSystem.EventHandlerを作成できますか?
または、オンまたはオフに切り替えてメソッドにブランチチェックを配置できる、ある種類のブールメンバー変数を作成できると思います。でもそれはクラッジのようです。
提案した両方の方法を使用できます。
イベントメソッドをデタッチし、コンボボックスにデータを追加し、次のようにイベントメソッドをアタッチします。
my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
populateCombo();
my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
my_Combo_SelectedIndexChanged
は、イベントにアタッチしたメソッドの名前です。
私は何度もそれをしました。解決策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
}
そのため、イベントがフォーカスされている場合にのみイベントが発生します。あなたが同じものを探していたことを願っています。それが役に立てば幸い
これが現在使用されているかどうかはわかりませんが、 この答え を見つけました。
MSDNライブラリから-ComboBox.SelectionChangeCommittedイベント
"SelectionChangeCommittedは、ユーザーがコンボボックスの選択を変更したときにのみ発生します。 SelectedIndexChanged または SelectedValueChanged ユーザーの変更をキャプチャします。これらのイベントは、選択がプログラムによって変更されたときにも発生するためです。」
他のブール値を作成する代わりに、control.ContainsFocusを使用します。ここでの注意点は、ユーザーがそのコントロールに集中できるようにする必要があることです。キーまたはマウスによる。
if(combo.ContainsFocus){ MyEventLogic();}
after
コードからイベントにサブスクライブします。 WinForms Designerを使用してサブスクライブしないでください。ロード中にそれができない場合は、次のことができます。
a)ブール変数bool loading
を定義し、コンボにデータを入力し始める前にtrue
に設定し、イベントハンドラーチェックで
if(loading)return;
b)イベントの登録を解除:
サブスクリプションが:
comboBox.SelectedIndexChanged + = delegate(...);
データの読み込みを開始する前のサブスクリプション解除は次のとおりです。
comboBox.SelectedIndexChanged-= delegate(...);
データの読み込みが完了したら、再度購読してください。