当窗体加载时停止comboBox的selectedIndexChanged事件触发

80

我有一个包含下拉列表的表单,使用了ComboBox。在comboBox的SelectedIndexChanged事件中运行一些代码,但是我不希望在表单加载时运行该代码。不幸的是,当我加载表单(在选择combobox之前),combobox的SelectedIndexChanged就会触发(我认为是在combobox进行databinding时)。有没有方法避免这种行为?


不确定在桌面上,但在.NET Compact中,这个事件似乎实际上会在Form_Load事件之前触发,这真的很棘手 - 当这段代码被执行时,表单上甚至还没有设置任何内容。在CF上,解决方案不幸的是一个在Load结束时设置的表单变量,然后事件处理程序在触发之前检查这个变量。 - SqlRyan
7个回答

155

6
如果出现自动完成的情况,该怎么办? - Arijit Mukherjee
@Arijit Mukherjee 对的。当在文本框中输入值而不是直接选择时,它不会触发SelectionChangeCommitted事件。 - thoitbk
1
该死,我在网上搜索了相当长时间才找到这样一个简单的解决方案。我一直在使用SelectionChanged事件,在VB.Net - WPF中它可以工作,但现在在C# - WinForms中使用它却不起作用,或者可能只是我自己的问题。谢谢! - Stephan
奥卡姆剃刀原则 - 最简单的解决方案最有可能是最好的选择(也是在这种情况下)。 - Destek

14

您可以简单地解绑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);

11

在为 ValueMemberDatamember 属性分配值后,在您的 onload() 函数中一定要设置 DataSource 属性。

这将有助于解决您的问题!


2
请添加更多信息以阐述您的想法。 - Lenin
@Ranjith:你能详细说明一下吗? - Peter Mortensen
解决了问题。谢谢,但请详细说明。 - hubert17
分配新的数据源会触发“selectedIndexChanged”事件。 - John
哈哈,这是什么疯狂的东西 =D!不过还是谢谢你! - Khaled
太完美了!谢谢。 - Javier dc

5

为什么不设置一个布尔标志来指示您的表单何时完成加载?

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


2
布尔值.. SelectionChangeCommitted 更好 - Piotr Kula
4
已经有一个布尔标志 Control.Created 告诉您,窗体已经完成加载,这对于窗体也是有效的。 - user1734987
ToolStripComboBox的变体没有SelectionChangeCommitted事件。因此,必须使用此方法。或者,为了防止竞态条件,使用lock和Monitor.TryEnter。 - spoulson
@user1734987:那不是同一件事。可能需要完成初始化代码,而Control.Created不会触发它。 - user195488

2
这里有一个简单的解决方案,可以几乎不改动你的代码:
在SelectedIndexChanged事件中,使用IsHandleCreated方法检查myComboBox句柄是否已创建。另一个添加的检查是检查用户是否实际上正在聚焦你的组合框控件以更改选定的索引。
 private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (myComboBox.IsHandleCreated &&  myComboBox.Focused)
        {
           // Do something here
        }
    }

你需要添加一个SelectedValue != null的检查,这样就是一个完美的解决方案了。 - Mecanik
是的,这也将是一个很好的附加检查。 - Mohamed Nagieb
我的ComboBox.Focused通常为False。 - Greatchap

1

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

-1

以下代码对我有用:

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

一旦下拉框中的所有项目都加载完毕,SelectionChangeCommitted将停止调用索引更改项,然后您只能逐个选择项目,这将提高加载速度。 - Anjan Kant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接