我的C#应用程序有comboBox
个SelectedIndexChanged
个事件。通常,我希望这个事件能够解雇,但有时候我需要事件才能解雇。我的comboBox
是MRU文件列表。如果发现列表中的文件不存在,则会从comboBox
中删除该项,并将comboBox
SelectedIndex
设置为零。但是,将comboBox
SelectedIndex
设置为零会导致SelectedIndexChanged
事件触发,在这种情况下会出现问题,因为它会导致某些UIF代码在事件处理程序中运行。是否有一种优雅的方法来禁用/启用C#表单控件的事件?感谢。
答案 0 :(得分:14)
使用
启动eventhandler方法ComboBox combo = sender as ComboBox;
if (combo.SelectedIndex == 0)
{
return;
}
如果你遇到的问题是使用不同的事件处理程序,你可以先删除事件处理程序的事件注册。
combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler;
combo.SelectedIndex = 0;
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler;
答案 1 :(得分:9)
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
答案 2 :(得分: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;
}
答案 3 :(得分:1)
一种(相当丑陋的)方法是在代码中设置一个删除条目的标志,然后在SelectedIndexChanged
处理程序中检查:
if (!deletedEntry)
{
// Do stuff
}
deletedEntry = false;
更好的方法可能是在删除方法开始时删除SelectedIndexChanged
事件处理程序并在结束时恢复它。这样你的代码就不会知道索引已经改变了。