UltraWinGrid嵌套对象属性与BindingSource绑定

时间:2012-01-12 05:06:00

标签: winforms bindingsource ultragrid ultrawingrid

我正在开发一个winforms应用程序,我通过ultrawingrid渲染域/对象数据。我使用绑定源将对象绑定到网格。对于简单的对象,这非常有用。

我正试图解决的问题是使用嵌套对象渲染对象,例如,Person类将具有Address类的属性。我想将地址(街道,城市,国家)的属性显示为网格上的列以及Person类的属性。

网格必须是可编辑的,任何用户更改都需要反映域对象(我正在通过绑定源进行)。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

<强>装订

我通常使用某种代码:

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

绑定列表将为您处理行的添加/删除,但它不知道Person内的属性。要使绑定的该部分工作,您需要Person实施INotifyPropertyChanged。这将在属性发生更改时通知ultragrid。代码看起来像这样(是的,不幸的是这使得它不能使用自动实现的属性):

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

展平对象层次结构

看起来你要求isn't directly possible。有几个选择:

  1. 在InitializeRow事件期间填写的UI中的未绑定列
  2. 修改您的Person类,使用一些代码来公开Address的属性,以处理属性的设置。
  3. (如果需要,我可以提供代码示例)

    一对多嵌套对象

    例如,如果您每个人有多个地址,则可以将它们嵌套在每个Person行下的可扩展部分中。要执行此操作,请在Person内部使用BindingList(Of Address)来实现INotifyPropertyChanged。不完全是你想要的,但是一个选项:)

    提醒

    如果您正在做MVP,请注意几点。显然,您需要在视图和演示者中对BindingList具有相同的引用。此外,如果您需要重置内容,我建议您调用list.Clear()而不是创建新内容。如果您在演示者中创建了一个新的,那么您将破坏与UltraGrid的连接,并且您必须在视图中重新设置DataSource属性。