【问题标题】:DataGridView and Binding List EventDataGridView 和绑定列表事件
【发布时间】:2011-02-28 04:50:04
【问题描述】:

我有一个数据网格视图,其数据源类型为绑定列表。

我知道当 datagridview 发生变化时,这将更新绑定列表中的项目。

我也知道,如果绑定列表中的对象实现 Inotifypropertychanged 那么如果对象在网格之外发生更改,那么对象将通知绑定列表,然后绑定列表将通知数据网格

我的问题是:

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

我该怎么做呢?

【问题讨论】:

    标签: .net winforms data-binding datagridview bindinglist


    【解决方案1】:

    好吧,当一个类实现 INotifyPropertyChanged 时,BindingList<T> 类会在每个 PropertyChanged 事件上引发其 ListChanged 事件,其中 ListChangedEventArgs 对象的 ListChangedType 属性等于 ItemChanged

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


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

    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
    

    DataBindingTestForm 类:基本的Form 类,DataGridView 绑定到BindingList(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
    

    自己尝试一下,如果遇到任何其他问题,请告诉我。

    【讨论】:

    • 感谢您的回复。让我重复一下我认为您所说的话,以便我澄清一下。就像现在一样,网格已绑定到列表。如果我更改网格中的单元格,它会更改列表中该对象的适当值。如何不引发 ListChanged 事件。为了在网格中更改属性时引发列表更改事件。我需要在对象中的属性上实现 INotifyPropertyChanged。所以事件流将是列表中的网格更改对象,对象触发 INotify,列表触发 listchanged 在注册 Inotify 时?
    • @bearrito:如果我理解正确,您似乎是在说当您修改DataGridView 中的值时不会引发ListChanged 事件。但它应该是。请参阅我更新的答案以获取一些简单的示例代码来演示这一点。如果您没有看到这种行为,您确定您已正确实施 INotifyPropertyChanged 吗?否则,如果您可以发布您拥有的代码,我会更好地帮助您。
    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 2018-04-20
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2012-09-14
    相关资源
    最近更新 更多