仅通过用户单击触发组合框 SelectedIndexChanged

问题描述 投票:0回答:5

我编写了一个方法来处理组合框的 SelectedIndexChanged 事件。

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

有没有一种简单的方法可以让组合框不触发事件,除非用户单击它?

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

或者我想我可以创建某种布尔成员变量,我可以打开或关闭它并在我的方法中进行分支检查。不过,这看起来像是一个拼凑。

c# winforms events combobox
5个回答
39
投票

不确定这现在是否有任何用处,但我发现了这个答案,这对我来说似乎更干净。

来自 MSDN 库 - ComboBox.SelectionChangeComfilled 事件

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


39
投票

我已经做过很多次了。 解决方案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
}

所以现在只有当事件处于焦点状态时才会被触发。希望您也在寻找同样的东西。 希望有帮助


9
投票

您可以使用您建议的两种方法:

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

    my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
    populateCombo();
    
    my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
    

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


4
投票

我会使用 control.ContainsFocus 而不是创建其他布尔值。这里需要注意的是,您必须确保用户将注意力集中在该控件上。通过键盘或鼠标即可。

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

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

    a) 定义一个布尔变量

    bool loading
    ,在开始用数据填充组合之前将其设置为
    true
    ,并在事件处理程序中检查

    如果(加载中) 返回;

    b) 取消订阅活动:

    如果订阅是:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.