Winforms 停止组合框';s selectedIndexChanged事件在窗体加载时触发

Winforms 停止组合框';s selectedIndexChanged事件在窗体加载时触发,winforms,data-binding,combobox,Winforms,Data Binding,Combobox,我有一个带有组合框的表单,它提供了一个下拉列表。在组合框的SelectedIndexChanged事件中,我正在运行一些代码,但我不希望在加载表单时运行这些代码。不幸的是,当我加载表单时(在组合框中进行选择之前),组合框的SelectedIndexChanged会触发(我认为当组合框是数据绑定时)。有没有办法避免这种行为?您只需解除SelectedIndexChanged事件的绑定,调用fill函数并再次绑定SelectedIndexChanged事件。不幸的是,这不适用于网格 例如: this

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

您只需解除
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);

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

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


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

在分配
ValueMember
Datamember
属性后,确保在
onload()函数中设置
DataSource
属性

这将帮助你解决你的问题

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

它在某种程度上对我有效,代码如下:

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

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

在SelectedIndexChanged事件中,检查myComboBox句柄是否使用()方法创建。另一个增加的检查是检查用户是否真正关注combobox控件以更改所选索引

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

Boooooolean。。SelectionChangeCommitted非常好已经有一个布尔标志“Control.Created”告诉您表单已经完成加载,这对表单也是有效的。
ToolStripComboBox
变体没有
SelectionChangeCommitted
事件。因此,这种方法将不得不这样做。或者,为了防止竞争条件,使用
lock
Monitor.TryEnter
@user1734987:这不是一回事。可能有需要完成和控制的初始化代码。Created不会触发该代码。请添加更多详细说明您想法的信息。@Ranjith:您能详细说明吗?解决了问题。谢谢,但请详细说明。分配一个新数据源会触发一个“selectedIndexChanged”事件。不确定桌面上是否有此事件,但在.NET Compact中,此事件实际上似乎在Form_Load事件之前触发,这确实有问题-当此代码被命中时,表单上甚至没有设置任何内容。不幸的是,在CF上,解决方案是一个在加载结束时设置的表单变量,然后事件处理程序在触发该变量之前检查该变量。但是在自动补偿的情况下该怎么办?@Arijit Mukherjee right。在文本框中键入值而不是直接选择时。它不会触发SelectionChangeCommitted事件该死,我在网上搜索了很长一段时间才找到这样一个简单的解决方案。我一直在使用SelectionChanged事件,它在VB.Net-WPF中工作,现在在C#-WinForms上使用它,但它不工作,或者可能只是我一个人。谢谢Akams Razor-最简单的解决方案是最有可能的(在这种情况下也是最好的)。SelectionChangeCommitted将停止调用索引更改项目,一旦所有项目加载到dropbox中,您就可以逐个选择,这也将提高您的加载速度。您需要添加SelectedValue!=空检查也是一个很好的解决方案。是的,这也是一个很好的附加检查。