修改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
事件处理程序并在结束时恢复它。 这样你的代码就不会知道索引已经改变了。