在DataBinding更新后触发事件处理程序

时间:2015-07-13 15:08:28

标签: .net vb.net winforms

我有一个绑定到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接口,我不知道如何覆盖自动生成的属性以正确实现它。

下面的@ Fabio解决方案通过在组合框选择改变时手动更新数据绑定解决了我的问题,这意味着我的事件处理可以在之后进行,数据对象将在数据网格刷新之前更新。我已经稍微重新调整了它的功能,以便在任何控件上使用第一个数据绑定:

Private Sub bindingUpdate(sender As Object, e As EventArgs)
    DirectCast(sender, Control).DataBindings(0).WriteValue()
    _data.NotifyDataChanged(sender, e)
End Sub

2 个答案:

答案 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)

我有点困惑,但听起来这就是你所问的:

  1. 你有一个Enumerable _data,它包含你绑定到DataGridView(DGV)的数据库中的几行。

  2. 您希望使用DGV中的控件而非更新DGV中的单个行。

  3. 这很不寻常。如果您的ComboBox是您的DGV中的一个单元格,那么您需要处理的就是处理CellValueChanged事件,一切都应该正常工作。

    话虽如此,您可以让您的ComboBox SelectedValue事件更新单元格值,然后触发CellValueChanged。