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

时间:2010-07-28 19:12:40

标签: c# winforms events

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

4 个答案:

答案 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)

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

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