我在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是否已实际更改?或者,欢迎提出可靠的解决方法。
答案 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")
希望现在更有意义了:)