.net WInforms组合框SelectionChangeCommitted事件并不总是更改SelectedValue

.net WInforms组合框SelectionChangeCommitted事件并不总是更改SelectedValue,.net,vb.net,winforms,visual-studio,visual-studio-2010,.net,Vb.net,Winforms,Visual Studio,Visual Studio 2010,我有一个在VS2010中用VB.Net构建的WinForms应用程序,下面的问题让我抓狂 我有一个带有组合框的表单,该组合框在加载表单时绑定到数据源: With Me.cboCompany .DataBindings.Clear() .DataSource = Me.m_dsBidResults.Tables("Company") .ValueMember = "company_id" .DisplayMember = "company_name" .D

我有一个在VS2010中用VB.Net构建的WinForms应用程序,下面的问题让我抓狂

我有一个带有组合框的表单,该组合框在加载表单时绑定到数据源:

 With Me.cboCompany
    .DataBindings.Clear()
    .DataSource = Me.m_dsBidResults.Tables("Company")
    .ValueMember = "company_id"
    .DisplayMember = "company_name"
    .DataBindings.Add("SelectedValue", Me.m_dsBidResults, Company.company_id")
 End With
我正在使用cboCompany.SelectionChangeCommitted事件按所选公司ID筛选datagridview:

Private Sub cboCompany_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCompany.SelectionChangeCommitted
    Dim intCompanyIDN As Integer        
    intCompanyIDN = CInt(cboCompany.SelectedValue)
    SelectBidder(intCompanyIDN)  ' sub to filter datagridview, update labels      
End Sub
只要用户不将焦点切换到其他控件,然后返回组合框,这似乎工作正常。切换焦点后,如果用户随后将组合框选择更改为下拉列表SelectedIndex=0中的第一项,则会触发SelectionChangeCommitted事件,但SelectedValue仍设置为以前选择的值。我在上面的事件处理程序中添加了一个消息框,并排显示SelectedIndex和SelectedValue,从而验证了这一点

'add this to SelectionChangeCommitted event handler
MsgBox(String.Format("Selected Index: {0}, Selected Value: {1}", cboCompany.SelectedIndex, cboCompany.SelectedValue))
如果用户将SelectedIndex更改为0以外的任何值,则不会发生这种情况;一切正常。我已经验证了我绑定到的表包含唯一的company\u id和company\u name值


是否需要使用其他事件来验证SelectedValue是否已实际更改?或者,我们也欢迎您提出可靠的解决方案。

从表单中删除这一行,然后重试

.DataBindings.Add("SelectedValue", Me.m_dsBidResults, Company.company_id")
解释: 这段代码告诉combobx它的SelectedValue属性应该绑定到数据集的公司id。这是没有用的,因为您已经通过设置datasource添加了一个列表,并且您说了valuemember和displaymember是什么。然后,您使用SelectionChangeCommitted事件实现了自己的逻辑,即当值更改时,它应该做什么。 仅当您有另一个绑定对象(例如Person类型的绑定对象)时,您删除的额外行才有用,该绑定对象的属性显示了他在哪个公司工作。在这种情况下,当组合框更改时,您希望将select company\u id推送到Person对象。差不多

personBindingsource1.DataSource = somePerson;
cboCompany.DataBindings.Add("SelectedValue", personBindingsource1, "WorksAtCompany")

希望它现在更有意义:

您是否尝试过其他事件,您是否可以让SelectedValueChanged和SelectedIndexChanged代替SelectionChangeCommitted事件,该事件在从下拉列表中选择项目并关闭下拉列表时触发?Jeremy-是,我尝试了SelectedIndexChanged和SelectedValueChanged,结果都是一样的。很好,这很有效,至少就我而言,这行代码是无关的。不过,我还是希望我能理解其中的原因。