Fire comboBox SelectedIndexChanged仅来自用户点击

时间:2011-09-29 20:09:28

标签: c# winforms events combobox

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

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

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

如果无法做到这一点,有没有办法暂时将事件与方法断开连接?我可以设置“my_combo.SelectedIndexChanged = null”然后创建一个新的System.EventHandler吗?

或者我想我可以创建某种布尔成员变量,我可以打开或关闭它并在我的方法中进行分支检查。不过,这似乎是一块垃圾。

5 个答案:

答案 0 :(得分:32)

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

Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;

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

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

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

所以现在只有在关注焦点时才会触发该事件。希望你也在寻找同样的东西。 希望它有助于

答案 1 :(得分:30)

现在还不确定这是否有用,但我找到了this answer,这对我来说似乎更清晰。

  

来自MSDN Library - ComboBox.SelectionChangeCommitted Event

     
    仅当用户更改组合框选择时才会引发 SelectionChangeCommitted 。请勿使用SelectedIndexChangedSelectedValueChanged来捕获用户更改,因为这些事件也会在选择以编程方式更改。“

  

答案 2 :(得分:9)

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

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

    my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
    populateCombo();
    
    my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
    
  3. my_Combo_SelectedIndexChanged是您附加到活动的方法的名称。

答案 3 :(得分:4)

我会使用control.ContainsFocus而不是创建其他bool。需要注意的是,您必须确保用户专注于该控件。通过键或鼠标。

if(combo.ContainsFocus){ MyEventLogic();}

答案 4 :(得分:2)

  1. 解决方案:如果您只使用静态值填充组合框,只需填充它们,after订阅代码中的事件即可。不要使用WinForms Designer订阅它。
  2. 如果在加载过程中无法实现:

    a)定义一个布尔变量bool loading,在开始用数据填充组合之前将其设置为true,并在事件处理程序检查中

    如果(装载)      返回;

    b)取消参加活动:

    如果订阅是:

    comboBox.SelectedIndexChanged + = delegate(...);

    开始加载数据之前取消订阅是:

    comboBox.SelectedIndexChanged - =委托(...);

  3. 当数据加载完成后,再次订阅。