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

本文关键字:三次 SelectedIndexChanged ComboBox 事件 加载 表单 为什么 | 更新日期: 2023-09-27 18:15:43

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

  1. 在数据绑定之前添加事件处理程序。

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

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

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

    编辑:我想我已经找到原因和解决办法了。事件被触发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();
    

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

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