【问题标题】:C# DevExpress XtraGrid, bind to property of nested classC# DevExpress XtraGrid,绑定到嵌套类的属性
【发布时间】:2011-02-20 07:04:57
【问题描述】:

通过将每列的 FieldName 设置为基础类中的属性名称,很容易将 XtraGrid 控件绑定到类。我们现在遇到了一种情况,我们希望显示嵌套在底层类中的类的数据。

即我们有一个“用户”类,其中包含一个名为“地址”的属性,它是另一个名为“地址”的类。 Address 中包含 Street、City 等属性。

我们希望在网格上显示 UserName(来自 User 类)和 Street(来自 Address 类)。这可能吗?

请注意,Address 不是 List,它是嵌套在 User 类中的一个类。

我们已尝试将网格列 FieldName 设置为“Address.Street”,但这无法获取数据。我希望这是可能的,这似乎是一个不支持的基本功能。

【问题讨论】:

    标签: c# binding devexpress xtragrid


    【解决方案1】:

    是的,你可以。添加未绑定列并处理 CustomUnboundColumnData 事件。

    未绑定的列。
    http://documentation.devexpress.com/#WindowsForms/CustomDocument1477

    CustomUnboundColumnData
    http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBaseColumnView_CustomUnboundColumnDatatopic

    【讨论】:

    • 谢谢阿西姆。这真的是嵌套类属性的最佳方法吗?我真的希望直接绑定网格列,而不是通过 CustomUnboundColumn 事件。
    • 是的。这就是 UnboundColumn 存在的原因。绝对比搞乱业务对象更好的方法。
    • 我遇到了同样的问题,并查看了您提供的链接。您是否有任何使用多级嵌套属性(例如:Customer->Person->Address->HouseNumber)实现此问题的示例代码
    • 对于未绑定的列,您只需为列/单元格设置“e.value”。你的模式有多深并不重要。只需获取数据/显示文本并设置'e.value'
    【解决方案2】:

    NestedClass.Property 就像常规属性一样添加。

    例如:

           settings.Columns.Add(column =>
        {
            column.Caption = "NestedClass";
            column.FieldName = "NestedClass.DataEntry";
            column.Name = "NestedClass";
    
        });
    

    最好的方法仍然是使用 unboundcolumns。但这行得通...

    【讨论】:

      【解决方案3】:

      假设您的代码中有以下类。

      1) 地址类

      public class Address {
          public string Street { get; set; }
      
          public string City { get; set; }
      }
      

      2) 用户类

      public class User {
      
          public string UserName { get; set; }
      
          public Address UserAddress { get; set; }
      }
      

      现在,您想将 Street 列绑定到属性 User.Address.Street,不幸的是,仅将 FieldName 设置为“Address.Street”是行不通的

      但是,如果按照你想要的方式完成它很重要,我建议你重写 Address 类的 ToString() 方法,如下所示:

      public class Address {
          public string Street { get; set; }
      
          public string City { get; set; }
      
          //Override ToString() method
          public override string ToString() {
              return this.Street;
          }
      }
      

      然后,将字段名称设置为“Address”,而不是“Address.Street”,这应该可以解决问题。

      另一种方法是在 User 类中添加另一个名为 UserStreet 的只读属性:

      public class User {
      
          public string UserName { get; set; }
      
          public Address UserAddress { get; set; }
      
          public UserStreet {
              get { return UserAddress != null ? UserAddress.Street : ""; } 
          }
      }
      

      然后将 FieldName 设置为“UserStreet”。

      希望这会有所帮助。

      【讨论】:

      • 我认为您的第二个选择可能是我们最终的选择。与处理未绑定的列并手动分配列数据相比,这是一个更整洁的解决方案。
      • 我很高兴它有帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2017-12-17
      • 2012-06-21
      • 2012-07-19
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多