【问题标题】:UltraWinGrid nested object properties binding with BindingSourceUltraWinGrid 嵌套对象属性与 BindingSource 绑定
【发布时间】:2012-01-12 05:06:00
【问题描述】:

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

我想要解决的问题是渲染一个带有嵌套对象的对象,例如 Person 类将具有 Address 类的属性。我想将 Address (Street, City, Country) 的属性显示为网格上的列以及 Person 类的属性。

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

解决此问题的最佳方法是什么?

【问题讨论】:

    标签: winforms bindingsource ultrawingrid


    【解决方案1】:

    绑定

    我通常使用这样的代码:

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

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

    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 的属性,并使用一些传递代码来处理属性的设置。

    (如果需要,我可以提供代码示例)

    一对多嵌套对象

    例如,如果每个人有多个地址,则可以将它们嵌套在每个 Person 行下的可展开部分中。为此,在您的Person 中,您将拥有一个BindingList(Of Address),它也实现了INotifyPropertyChanged。不完全是您想要的,而是一个选项:)

    注意事项

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

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2022-07-05
      • 2011-04-17
      • 2018-03-16
      相关资源
      最近更新 更多