DataGridView и событие списка привязок - PullRequest
1 голос
/ 05 июня 2010

У меня есть сетевое представление с источником данных с типом списка привязок.

Я понимаю, что когда изменилось сетевое представление, это обновит элементы в списке привязок.

Я также знаю, что еслиобъекты в списке привязок реализуют Inotifypropertychanged, тогда, если объекты изменяются вне сетки, объекты уведомляют список привязок, который затем уведомляет сетку данных

Мой вопрос:

Если представление сетки данных изменяет объект, я хочу, чтобы список связывания или измененный объект вызывали событие, позволяющее мне передать объект службе WCF, которая сохранит объект на стороне уровня доступа к данным, например, Service.Save (ChangedObject)

Как бы я поступил так?

1 Ответ

1 голос
/ 05 июня 2010

Хорошо, когда класс реализует INotifyPropertyChanged, класс BindingList<T> вызывает свое событие ListChanged для каждого события PropertyChanged с объектом ListChangedEventArgs, свойство ListChangedType которого равно ItemChanged.

Вооружившись этим знанием, я чувствую, что вы должны быть в состоянии выполнить то, что вы хотите. (Где 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

Класс 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 (например, с «Джона» на «Джордж»), появляется окно сообщения со следующим текстом:

ListChanged event fired. Index: 0, Value: George

Попробуйте сами и дайте мне знать, если у вас возникнут какие-либо проблемы.

...