1

タイプバインディングリストのデータソースを持つデータグリッドビューがあります。

datagridview が変更されると、バインディング リスト内の項目が更新されることを理解しています。

また、バインディングリスト内のオブジェクトが Inotifypropertychanged を実装している場合、オブジェクトがグリッド外で変更された場合、オブジェクトはバインドリストに通知し、データグリッドに通知することも知っています

私の質問は:

データグリッドビューがオブジェクトを変更する場合、バインディングリストまたは変更されたオブジェクトが、データアクセスレイヤー側でオブジェクトを永続化するWCFサービスにオブジェクトを渡すことができるイベントを発生させたい.たとえば、Service.Save(ChangedObject)

どうすればこれを行うことができますか?

4

1 に答える 1

1

クラスが を実装するINotifyPropertyChangedと、BindingList<T>クラスは、プロパティが に等しいオブジェクトを持つListChangedPropertyChangedイベントでイベントを発生させます。ListChangedEventArgsListChangedTypeItemChanged

この知識を武器に、あなたが望むことを達成できるはずだと思います。(ここ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クラスDataGridViewBindingList(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 に答える