【问题标题】:WInforms Combobox SelectionChangeCommitted event doesn't always change SelectedValueWInforms Combobox SelectionChangeCommitted 事件并不总是改变 SelectedValue
【发布时间】:2012-03-23 18:24:14
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过其他事件,您能否给 SelectedValueChanged 和 SelectedIndexChanged 一个 go,而不是在从下拉列表中选择项目并且下拉列表关闭时触发的 SelectionChangeCommitted 事件?跨度>
  • Jeremy - 是的,我尝试过 SelectedIndexChanged 和 SelectedValueChanged,结果相同。

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


【解决方案1】:

从表单中删除此行并重试

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

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

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

希望它现在更有意义:)

【讨论】:

  • 太棒了,这行得通,至少对我而言,那行代码是无关的。不过,希望我能理解根本原因。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2020-02-27
  • 2010-09-20
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多