2

私は、ウルトラウィンググリッドを介してドメイン/オブジェクトデータをレンダリングしているwinformsアプリケーションに取り組んでいます。オブジェクトをグリッドにバインドするために bindingsource を使用しています。単純なオブジェクトの場合、これは非常にうまく機能します。

私が理解しようとしているのは、ネストされたオブジェクトを持つオブジェクトをレンダリングすることです。たとえば、Person クラスには Address クラスのプロパティがあります。Person クラスのプロパティと共に、Address (Street、City、Country) のプロパティをグリッドの列として表示したいと考えています。

グリッドは編集可能である必要があり、ユーザーの変更はドメイン オブジェクトに反映される必要があります (バインディング ソースを介して行っています)。

これについて最善の方法は何ですか?

4

1 に答える 1

1

バインディング

私は通常、次のようなコードを使用します。

Dim persons = new BindingList(Of Person)
UltraGrid1.DataSource = persons

バインディング リストは行の追加/削除を処理しますが、 内のプロパティについては知りませんPerson。バインディングのその部分を機能させるには、INotifyPropertyChangedPersonを実装する必要があります。これにより、プロパティが変更されたときにウルトラグリッドに通知されます。コードは次のようになります (はい、残念ながらこれにより、自動実装されたプロパティを使用できなくなります)。

Private _phoneNumber As String
Public Property PhoneNumber As String
  Get
    Return Me._phoneNumber
  End Get
  Set(ByVal value As String)
    If value <> _phoneNumber Then
      Me._phoneNumber = value
      NotifyPropertyChanged("PhoneNumber")
    End If
  End Set
End Property

オブジェクト階層のフラット化

あなたが求めていることは直接可能ではないようです。いくつかのオプションがあります:

  1. InitializeRow イベント中に入力する UI のバインドされていない列
  2. クラスを変更して、プロパティの設定を処理するパススルー コードを使用してPersonのプロパティを公開します。Address

(必要に応じてコード サンプルを提供できます)

1 対多のネストされたオブジェクト

たとえば、1 人に複数の住所がある場合は、Person各行の下の展開可能なセクションにネストして表示できます。これを行うには、内部に も実装しPersonます。まさにあなたが望むものではありませんが、オプション:)BindingList(Of Address)INotifyPropertyChanged

注意事項

MVPを実行している場合の注意点。BindingList明らかに、ビューとプレゼンターに同じ参照が必要です。また、コンテンツをリセットする必要がある場合はlist.Clear()、新しいものを作成するのではなく、電話することをお勧めします. プレゼンターで新しいものを作成すると、 との接続が切断され、ビューでプロパティUltraGridを再設定する必要があります。DataSource

于 2012-06-14T21:56:25.307 に答える