【问题标题】:Stop comboBox's selectedIndexChanged event from firing when the form loads表单加载时停止触发组合框的 selectedIndexChanged 事件
【发布时间】:2011-03-16 20:22:12
【问题描述】:

我有一个带有ComboBox 的表单,它提供了一个下拉列表。在组合框的SelectedIndexChanged event 上,正在运行一些代码,但我不希望该代码在表单加载时运行。不幸的是,当我加载表单时(在我在组合框中进行选择之前),组合框的SelectedIndexChanged 会触发(我认为当组合框是databinding 时)。有没有办法避免这种行为?

【问题讨论】:

  • 不确定在桌面上,但在 .NET Compact 中,此事件实际上似乎在 Form_Load 事件之前触发,这确实有问题 - 当此代码获取时,表单上什至没有设置打。在 CF 上,不幸的是,解决方案是在 Load 结束时设置的表单变量,然后事件处理程序在触发之前检查此变量。

标签: winforms data-binding combobox


【解决方案1】:

这是一个简单的解决方案,几乎不会影响您的代码:

在 SelectedIndexChanged 事件中,检查 myComboBox 句柄是否是使用 (IsHandleCreated) 方法创建的。另一个添加的检查是检查用户是否真的在关注您的组合框控件来更改选定的索引。

 private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (myComboBox.IsHandleCreated &&  myComboBox.Focused)
        {
           // Do something here
        }
    }

【讨论】:

  • 您还需要为此添加一个 SelectedValue != null 检查,然后这是一个完美的解决方案。
  • 是的,这也是一个很好的附加检查。
  • myComboBox.Focused 通常为 False
【解决方案2】:

VB

RemoveHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged
lbxNomes.DataSource = dst
Label1.Text = String.Format("Encontrados {0} Sócios nesta pesquisa", dst.Rows.Count)
Label1.Visible = True
AddHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged

【讨论】:

    【解决方案3】:

    以下代码对我有用:

      private void ddlChapter_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (ddlChapter.SelectedValue != null)
            {
               // Do something here
            }
        }
    

    【讨论】:

    • SelectionChangeCommitted 将停止调用索引更改项目,一旦所有项目加载到 dropbox 中,您就可以只选择一项,这也会提高您的加载速度。
    【解决方案4】:

    如果您只想在用户更改组合框中的选定项时做出反应,那么最好订阅SelectionChangeCommitted

    【讨论】:

    • 但是如果出现自动竞争怎么办?
    • @Arijit Mukherjee 对。在文本框中输入值而不是直接选择时。它不会触发 SelectionChangeCommitted 事件
    • 该死,我已经在网上搜索了很长时间才能找到这样一个简单的解决方案。我一直在使用 SelectionChanged 事件,它在 VB.Net - WPF 中工作,现在在 C# - WinForms 上使用它,它不起作用,或者可能只是我。谢谢!
    • Akams Razor - 最简单的解决方案是最有可能的(在这种情况下也是最好的)。
    【解决方案5】:

    您可以简单地取消绑定SelectedIndexChanged 事件,调用您的fill 函数并再次绑定SelectedIndexChanged 事件。不幸的是,这不适用于网格。

    例如:

    this.cmb.SelectionChanged -= new System.EventHandler(this.cmb_SelectionChanged);
    cmb.fill(); //Your function
    this.cmb.SelectionChanged += new System.EventHandler(this.cmb_SelectionChanged);
    

    【讨论】:

      【解决方案6】:

      在分配ValueMemberDatamember 属性后,请务必在onload() 函数中设置DataSource 属性。

      这将帮助您解决问题!

      【讨论】:

      • 请添加更多信息来阐述您的想法。
      • @Ranjith:你能详细说明一下吗?
      • 解决了这个问题。谢谢,但请详细说明。
      • 分配一个新的数据源会触发一个“selectedIndexChanged”事件。
      • 大声笑,这是什么疯狂 =D!不过谢谢!
      【解决方案7】:

      为什么没有boolean 标志来指示您的Form 何时完成加载?

      在您的SelectionChanged 事件中,检查boolean 标志是否为true。如果是true,则处理该事件,否则忽略它。

      【讨论】:

      • booooooolean.. SelectionChangeCommitted 更好
      • 已经有一个布尔标志 `Control.Created` 告诉你,表单已经加载完毕,对表单也有效。
      • ToolStripComboBox 变体没有SelectionChangeCommitted 事件。所以,这个方法将不得不做。或者,为了防止出现竞争条件,请使用 lockMonitor.TryEnter
      • @user1734987:这不是一回事。可能有需要完成的初始化代码,而 Control.Created 不会触发它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多