修改ComboBox SelectedIndex而不在C#中触发事件

我的C#应用​​程序有一个带有SelectedIndexChanged事件的comboBox 。 通常,我希望这个事件能够解雇,但有时候我需要事件才能解雇。 我的comboBox是一个MRU文件列表。 如果发现列表中的文件不存在,则从comboBox删除该项,并将comboBox SelectedIndex设置为零。 但是,将comboBox SelectedIndex设置为零会导致SelectedIndexChanged事件触发,在这种情况下会出现问题,因为它会导致某些UIF代码在事件处理程序中运行。 是否有一种优雅的方法来禁用/启用C#表单控件的事件? 谢谢。

使用启动eventhandler方法

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

如果问题是使用不同的事件处理程序,则可以先删除事件处理程序的事件注册。

 combo.SelectedIndexChanged -= EventHandler SomeEventHandler; combo.SelectedIndex = 0; combo.SelectedIndexChanged += EventHandler SomeEventHandler; 

多年来我多次遇到这种情况。 我的解决方案是有一个名为_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 

我很惊讶没有更好的方法来做到这一点,但这就是我这样做的方式。 我实际上使用大多数控件的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; } 

一种(相当丑陋)的方法是在代码中设置一个删除条目的标志,然后在SelectedIndexChanged处理程序中检查:

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

更好的方法可能是在delete方法的开头删除SelectedIndexChanged事件处理程序并在结束时恢复它。 这样你的代码就不会知道索引已经改变了。