2010-07-28 83 views
7

我的C#應用​​程序有comboBoxSelectedIndexChanged事件。通常情況下,我希望這個事件能夠觸發,但是有時候我需要這個事件不會觸發。我的comboBox是一個MRU文件列表。如果發現列表中的文件不存在,則將該項目從comboBox中移除,並將comboBoxSelectedIndex設置爲零。但是,將comboBoxSelectedIndex設置爲零會導致觸發SelectedIndexChanged事件,在這種情況下,該事件有問題,因爲它會導致某些UIF代碼在事件處理程序中運行。有沒有優雅的方式來禁用/啓用C#表單控件的事件?謝謝。修改組合框SelectedIndex而不觸發C事件#

回答

11

ComboBox combo = sender as ComboBox; 
if (combo.SelectedIndex == 0) 
{ 
    return; 
} 

啓動事件處理方法,如果你的問題是有不同的事件處理程序,你可以先刪除該事件處理程序的事件註冊。

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
combo.SelectedIndex = 0; 
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
1

一(相當醜陋的)的方式是設置在刪除該條目中的代碼標誌,然後檢查,在SelectedIndexChanged處理:

if (!deletedEntry) 
{ 
    // Do stuff 
} 
deletedEntry = false; 

一個更好的辦法可能是刪除您SelectedIndexChanged事件處理程序在刪除方法的開始,並在最後恢復它。這樣你的代碼就不會知道索引已經改變了。

8

多年來我遇到過這麼多次。我的解決方案是有一個名爲_noise的類級變量,如果我知道即將更改組合索引或任何其他類似的控件,當選定的索引更改時觸發,我會在代碼中執行以下操作。

private bool _noise; 

這裏是控件的事件處理程序的代碼

private void cbTest_SelectedIndexChange(object sender, EventArgs e) 
{ 
    if (_noise) return; 

    // process the events code 

    ... 

} 


後來,當我知道我要改變索引,我請執行下列操作:

_noise = true; // cause the handler to ignore the noise... 


cbTest.Index = value; 


_noise = false; // let the event process again 
3

我很驚訝沒有這樣做的更好的方式,但這是我做到這一點的方式。我實際上使用大多數控件的Tag字段,所以我不必爲控件進行子類化。並且我使用true/null作爲值,因爲null是默認值。

當然,如果你實際使用Tag,你需要以不同的方式做到這一點...

在處理程序:

private void control_Event(object sender, EventArgs e) 
{ 
    if (control.Tag != null) return; 

    // process the events code 

    ... 

} 

在主代碼

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
} 
相關問題