2009-04-13 55 views
29

如何在WinForms中暫時禁用事件處理程序?WinForms:暫時禁用事件處理程序

+0

你能分享一下你在做什麼嗎?因爲您可能不希望禁用_ALL_事件處理程序(該窗體的默認繪畫和移動處理程序會讓人想到)。 – 2009-04-13 16:38:56

+0

我只是不想在程序更新時捕獲控件狀態的變化。是的,我不想禁用_ALL_事件處理程序,只是「事件處理程序」。 http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George 2009-04-13 16:53:40

回答

47

可能,(它不需要退訂或其他的東西)的最簡單方法是定義一個布爾值,並在處理程序開始檢查:

bool dontRunHandler; 

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

    // handler body... 
} 
+2

這很簡單,但如果你經常使用它,代碼會很混亂。 – maamaa 2015-12-03 04:26:13

40

禁止從什麼角度?如果要刪除這是從對處理程序委託的列表中選擇範圍的方法,你可以做..

object.Event -= new EventHandlerType(your_Method); 

這將從代表的列表中刪除該方法,並且以後可以重新連接它與

object.Event += new EventHandlerType(your_Method); 
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);