为什么ComboBox.SelectedIndexChanged事件在表单加载之前触发三次?

时间:2015-10-02 07:52:06

标签: c# winforms

我对组合框数据绑定有点问题。我有一个有一个组合框的表单,根据ComboBox中的选择,表单应该填充数据。我使用SelectedIndexChanged事件而不是SelectionChangeCommitted,因为我希望能够在表单加载时使用ComboBox中第一个项目的数据填充表单。我尝试了两种解决方案:

  1. 在数据绑定之前添加事件处理程序。
  2. 这个解决方案几乎可以正常工作。它选择第一个ComboBox项并用相关数据填充表单但由于某种原因,此事件在绑定数据时触发三次,这使得表单加载缓慢,因为从数据库调用了一些数据,基本上这些数据被加载了3次。

    1. 在数据绑定后添加事件处理程序。
    2. 此解决方案不能像我想要的那样工作,因为尽管在表单加载后在ComboBox中正确选择了第一个项目,但它没有用相关数据填充表单。这主要是因为我在完成数据绑定后添加了事件处理程序(用数据填充表单)。关于这个解决方案的好处是该事件不会连续3次被触发,但这是该解决方案的唯一好处,因为表单没有像预期的那样填充相关数据。

      有没有人知道为什么这个事件会被解雇3次?作为解决问题的一种可能方法,我可以调用方法,该方法应该由事件触发,在数据绑定之后,然后将事件处理程序添加到ComboBox,但这看起来像是一种做事的hackish方式。如果有人可以提供更好的方法来完成任务,我会非常高兴。但是,如果我的解决方案恰好是唯一/最好的处理方式,那么有人可能会告诉我在数据绑定期间多次触发事件的技术原因吗?

      编辑:我想我已经找到了原因和解决方案。事件被解雇3次的原因并不是数据绑定解雇了3次 - 这是因为分配DisplayMember和ValueMember也解雇了这个事件。

      之前:

      combo.SelectedIndexChanged += new System.EventHandler(this.combo_SelectedIndexChanged);
      combo.DataSource = getItems().ToList();  
      combo.ValueMember = "Key";  
      combo.DisplayMember = "Value";  
      

      之后:

      combo.ValueMember = "Key";
      combo.DisplayMember = "Value";  
      combo.SelectedIndexChanged += new System.EventHandler(this.combo_SelectedIndexChanged);
      combo.DataSource = getItems().ToList();
      

1 个答案:

答案 0 :(得分:0)

如果在同时加载winform和组合框的数据源时出现此问题,请检查combobox.Focused值。如果在表单加载时正在定义数据源,则表示没有进行真正的选择,因此对象没有焦点。所以在selectionChanged事件中添加。     if(combobox.Focused == true)     {          //做一点事     }

然后问题就消失了......