2009-04-13 21 views
29

WinFormsでイベントハンドラを一時的に無効にするにはどうすればよいですか?WinForms:イベントハンドラを一時的に無効にする

bool dontRunHandler; 

void Handler(object sender, EventArgs e) { 
    if (dontRunHandler) return; 

    // handler body... 
} 
+0

より高いレベルで行っていることを共有できますか?おそらく_ALL_イベントハンドラを無効にしたくないからです(フォームのデフォルトペイントと移動ハンドラが気になります)。 –

+0

コントロールをプログラムで更新するときに、コントロールの状態の変更をキャッチしたくないだけです。そして、はい、私は_ALL_イベントハンドラを無効にしたくない、ちょうど "イベントハンドラ"です。 http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George

答えて

47

は、(退会または他のものを必要としない)最も簡単な方法は、ブール値を宣言し、ハンドラの先頭で、それをチェックすることですか?あなたは、ハンドラのデリゲートのリストから自分のスコープ内のメソッドを削除したい場合は、あなただけ..

object.Event -= new EventHandlerType(your_Method); 

これは、デリゲートのリストから、そのメソッドを削除しますかすることができ、あなたは後でそれを再接続することができます

object.Event += new EventHandlerType(your_Method); 
+2

これは簡単ですが、これを頻繁に使用するとコードが混乱することになります。 – maamaa

40

無効にどのような視点から:おそらく

+5

your_Method()の代わりにyour_Methodを意味すると思います。 C#2.0以降、 "new EventHandlerType"の部分は必要ありません。単にobject.Event + = yourMethodです。とobject.Event - = yourMethod; –

+0

ええ、私はそれがサンズパンレンであることを意味しました;)。しかし暗黙の代理人の構成を意識していなかった。それは知って良いです。 –

+0

この考え方は、コンボボックスEditValueChangedのためにハンドラを一時的に無効にする必要があるシナリオでは、(受け入れられた回答と比較して)私には役に立ちます。 – PhoenixDev

1

私はこのように、コントロール拡張を使用しています。

public static void SetDatasource(
    this ComboBox cb, 
    object dataSource, 
    EventHandler _SelectedIndexChanged_eventHandler = null, 
    EventHandler _SelectedValueChanged_eventHandler = null) 
{ 
//disable events 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged -= _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged -= _SelectedValueChanged_eventHandler; 
    if (cb.InvokeRequired) 
    { 
    cb.BeginInvoke(new _d_SetDatasource_ComboBox(SetDatasource), new object[] { cb, dataSource, _SelectedIndexChanged_eventHandler}); 
    } 
    else 
    { 
    cb.DataSource = dataSource; 
    //events enabled again 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged += _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged += _SelectedValueChanged_eventHandler; 
    } 
} 
private delegate void _d_SetDatasource_ComboBox(ComboBox cb, object dataSource, EventHandler _SelectedIndexChanged_eventHandler = null, EventHandler _SelectedValueChanged_eventHandler = null); 
関連する問題