Fire comboBox SelectedIndexChanged仅来自用户点击

mic*_*ver 17 c# events combobox winforms

我写了一个方法来处理一个comboBox的SelectedIndexChanged事件.

在构造函数中,我填充了comboBox,这激活了我的事件处理方法.我不想要,因为没有人点击comboBox.

除非用户点击它,否则有一种简单的方法可以让comboBox不触发事件?

如果那是不可能的,有没有办法暂时将事件与方法断开连接?我可以设置"my_combo.SelectedIndexChanged = null"然后创建一个新的System.EventHandler吗?

或者我想我可以创建某种布尔成员变量,我可以打开或关闭并在我的方法中放置分支检查.不过,这看起来像是一块垃圾.

San*_*ndy 33

我做了很多次.解决方案1:从设计器中删除EventHandler.填充组合框,然后设置EventHandler.

Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;
Run Code Online (Sandbox Code Playgroud)

但它只有在你填充组合框时才会起作用.如果你这么做很多次,那么你可能会陷入混乱.

解决方案2:我的偏好和我经常使用它.将您的选择更改事件更改为:

private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox cb = (ComboBox)sender;
   if(!cb.Focused)
   {
      return;
   }
   // Here is your Code for selection change
}
Run Code Online (Sandbox Code Playgroud)

所以现在只有在关注焦点时才会触发事件.希望你也在寻找同样的东西.希望能帮助到你

  • 为创造力投票。我已经在其他框架 (Qt) 上使用过这个解决方案,但它最终导致了一些不好的副作用。在那种情况下仍然是最好的解决方案。在这里,可能不是。 (2认同)

Lan*_*art 30

不知道现在是否有用,但我找到了这个答案,这对我来说似乎更清晰.

MSDN Library - ComboBox.SelectionChangeCommitted事件

" 只有在用户更改组合框选择时才会引发SelectionChangeCommitted.不要使用SelectedIndexChangedSelectedValueChanged来捕获用户更改,因为当选择以编程方式更改时也会引发这些事件."

  • 这是迄今为止最简单的方法.它可以完成用户想要的操作而无需创建和销毁事件处理程序.它还鼓励更好的编程实践,其中使用布尔来同步事件而不管其他事件是危险的. (3认同)
  • 我也同意.这很简单,效果很好.接受的答案对我不起作用,与此解决方案相比,它看起来确实很混乱. (3认同)

Fil*_*vić 9

您可以使用以下两种方法:

  1. 使用布尔变量
  2. 分离事件方法,填充组合框,附加这样的事件方法

    my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
    populateCombo();
    
    my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
    
    Run Code Online (Sandbox Code Playgroud)

my_Combo_SelectedIndexChanged 是您附加到事件的方法的名称.