WInforms Combobox SelectionChangeCommitted事件并不总是更改SelectedValue

时间:2012-03-23 18:24:15

标签: .net vb.net winforms visual-studio visual-studio-2010

我在VS 2010中使用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过滤数据网格视图:

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_id和company_name的唯一值。

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

1 个答案:

答案 0 :(得分:2)

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

.DataBindings.Add("SelectedValue", Me.m_dsBidResults, Company.company_id")

<强> Explanantion:
此代码告诉combobx,其SelectedValue属性应绑定到数据集的company_id。这没用,因为您已经通过设置数据源添加了一个列表,并且您说了valuemember和displaymember是什么。然后,您通过使用SelectionChangeCommitted事件在值更改时应该执行的操作实现了自己的逻辑。 你删除的额外行只有在你有另一个绑定对象时才有用,比如类型为Person,它具有显示在他工作的公司的属性。在这种情况下,当组合框发生更改时,您希望将select_id_id推送到Person-object。像

这样的东西
personBindingsource1.DataSource = somePerson;
cboCompany.DataBindings.Add("SelectedValue", personBindingsource1, "WorksAtCompany")

希望现在更有意义了:)