我有一个绑定到ComboBox的数据对象,当该ComboBox中的选定值发生更改时,我想更新数据对象,然后刷新对象绑定的数据网格。
我遇到的问题是,据我所知,我附加的事件处理程序在数据对象更新之前触发,因此当我的数据网格刷新时,它仍然包含旧的ComboBox值。
这是我的ComboBox控件初始化:
cmbPaymentType.DataSource = _paymentTypes
cmbPaymentType.DisplayMember = "PaymentTypeName"
cmbPaymentType.DataBindings.Add("SelectedItem", _data, "PaymentType", False, DataSourceUpdateMode.OnPropertyChanged)
cmbPaymentType.Refresh()
AddHandler cmbPaymentType.DropDownClosed, AddressOf _data.NotifyDataChanged
触发NotifyDataChanged时,将刷新使用我的数据对象_data
的数据网格,但不会更新PaymentType的值。如果我之后从其他地方触发NotifyDataChanged,数据网格会更新到所选的组合框值,这表示数据对象绑定有效,它只是在我的应用程序流中绑定太晚了。
如何在更新数据绑定后触发事件?
谢谢!
编辑:数据对象_data
是一个自动生成的Entity Framework类,其中附加了一个我写的部分类。如果我使用INotifyPropertyChanged
接口,我不知道如何覆盖自动生成的属性以正确实现它。
Private Sub bindingUpdate(sender As Object, e As EventArgs)
DirectCast(sender, Control).DataBindings(0).WriteValue()
_data.NotifyDataChanged(sender, e)
End Sub
答案 0 :(得分:2)
您的问题与tcp_echo_subtraction
绑定
由于@Charlie在注释中注意到,只有在ComboBox失去焦点后,才会更新有界项的属性(在绑定到SelectedItem
的情况下)。
因为你想要绑定到对象,而不是绑定到对象的属性,最简单的方法是手动发送有关更新值的消息
为SelectedItem
事件创建处理程序,在SelectionChangesCommitted
更改时触发
SelectedItem
另一种方法是使用DataBinding到Private Sub cmbPaymentType_SelectionChangesCommitted(sender As Object, e As EventArgs)
DirectCast(sender, ComboBox).Bindings("SelectedItem").WriteValue()
'Here you can update datagrid too
End Sub
。然后,您需要设置SelectedValue
ComboBox.ValueMember
答案 1 :(得分:-1)
我有点困惑,但听起来这就是你所问的:
你有一个Enumerable _data,它包含你绑定到DataGridView(DGV)的数据库中的几行。
您希望使用DGV中的控件而非更新DGV中的单个行。
这很不寻常。如果您的ComboBox是您的DGV中的一个单元格,那么您需要处理的就是处理CellValueChanged事件,一切都应该正常工作。
话虽如此,您可以让您的ComboBox SelectedValue事件更新单元格值,然后触发CellValueChanged。