1

我有一个带有绑定列表类型数据源的 datagridview。

我了解当 datagridview 更改时,这将更新绑定列表中的项目。

我也知道,如果 bindinglist 中的对象实现 Inotifypropertychanged 那么如果对象在网格之外发生更改,那么对象将通知 bindlist 然后通知 datagrid

我的问题是:

如果数据网格视图更改了对象,我希望绑定列表或更改的对象触发一个事件,该事件允许我将对象传递给 WCF 服务,该服务将在数据访问层端持久保存对象,例如 Service.Save(ChangedObject)

我该怎么做呢?

4

1 回答 1

1

好吧,当一个类实现 时INotifyPropertyChanged,该类会在每个事件上使用一个属性等于的对象BindingList<T>引发它的事件。ListChangedPropertyChangedListChangedEventArgsListChangedTypeItemChanged

有了这些知识,我觉得你应该能够完成你想要的。(其中ListChangedType == ListChangedType.ItemChanged,将 的索引NewIndex处的对象传递BindingList<T>给您的服务。)


更新:下面是我编写的示例应用程序,用于演示通过以下方式修改项目引发ListChanged事件:DataGridView

类:一个简单的CustomObject实现INotifyPropertyChanged

Imports System.ComponentModel

Public Class CustomObject
    Implements INotifyPropertyChanged

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
            OnPropertyChanged("Name")
        End Set
    End Property

    Protected Sub OnPropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

End Class

类:一个绑定到 a的DataBindingTestForm基本FormDataGridViewBindingList(Of CustomObject)

Imports System.ComponentModel

Public Class DataBindingTestForm

    Private WithEvents _customObjects As New BindingList(Of CustomObject)

    Private Sub DataBindingTestForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim obj As New CustomObject
        obj.Name = "John"
        _customObjects.Add(obj)

        obj = New CustomObject
        obj.Name = "Bill"
        _customObjects.Add(obj)

        MainDataGridView.DataSource = _customObjects
    End Sub

    Private Sub _customObjects_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles _customObjects.ListChanged
        If Not e.ListChangedType = ListChangedType.ItemChanged Then Return

        Notify("ListChanged event fired. Index: {0}, Value: {1}", e.NewIndex, _customObjects(e.NewIndex).Name)
    End Sub

    Private Sub Notify(ByVal format As String, ByVal ParamArray args() As Object)
        MsgBox(String.Format(format, args))
    End Sub

End Class

在运行上述演示应用程序时,当我更改单元格中的值DataGridView(例如,从“John”到“George”)时,会出现一个消息框,其中包含以下文本:

ListChanged event fired. Index: 0, Value: George

自己尝试一下,如果您遇到任何进一步的问题,请告诉我。

于 2010-06-05T17:40:41.997 回答