表单加载时停止触发comboBox的selectedIndexChanged事件


75

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


不确定是否在桌面上,但是在.NET Compact中,此事件实际上似乎在Form_Load事件之前触发,这确实是有问题的-当该代码被命中时,表单上的任何内容都没有设置。不幸的是,在CF上,解决方案是在Load末尾设置一个form变量,然后事件处理程序在触发该变量之前对其进行检查。
SqlRyan

Answers:


147

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


6
但是,如果发生自动竞争,该怎么办?
Arijit Mukherjee 2014年

@Arijit Mukherjee对。在文本框中输入值而不是直接选择时。它不会触发SelectionChangeCommitted事件
thoitbk 2015年

该死的,我已经在网上搜索了很长时间,找到了这样的简单解决方案。我一直在使用SelectionChanged事件,它在VB.Net-WPF中有效,现在在C#-WinForms中使用它,它不起作用,也许只是我自己。谢谢!
斯蒂芬

Akams Razor-最简单的解决方案是最有可能的(在这种情况下也是最好的)。
Destek

13

您可以简单地取消绑定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

分配和属性后,请务必DataSourceonload()函数中设置属性。ValueMemberDatamember

这将帮助您解决问题!


1
请添加更多信息,以阐明您的想法。
列宁

@Ranjith:您能详细说明吗?
Peter Mortensen

解决问题。谢谢,但请详细说明。
hubert17

分配新的数据源将引发“ selectedIndexChanged”事件。
约翰

5

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

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


2
booooooolean .. SelectionChangeCommitted好得多
Piotr Kula 2012年

3
已经有一个布尔值`Control.Created`告诉您表单已完成加载,这对表单也有效。
user1734987

ToolStripComboBox变化没有SelectionChangeCommitted事件。因此,此方法将必须执行。或者,为防止比赛情况,请使用lockMonitor.TryEnter
Spoulson

@ user1734987:那不是同一回事。可能需要完成初始化代码,Control.Created不会触发该初始化代码。

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

0

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

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

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

-1

它通过以下代码对我有用:

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

SelectionChangeCommitted将停止调用索引更改项,将所有项加载到Dropbox中后,您只能一一选择,这也会提高加载速度。
Anjan Kant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.