C#DevExpress XtraGrid,绑定到嵌套类的属性

时间:2011-02-20 07:04:58

标签: c# binding devexpress xtragrid

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

即。我们有一个“User”类,它包含一个名为“Address”的属性,这是另一个名为“Address”的类。地址内包含街道,城市等属性。

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

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

我们已尝试将网格列FieldName设置为“Address.Street”,但这不能用于拾取数据。我希望这是可能的,这似乎是不支持的基本特征。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

NestedClass.Property只是添加常规属性。

e.g:

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

    });

最佳方法仍然使用unboundcolumns。但这有效......

答案 2 :(得分:2)

让我们假设您的代码中包含以下类。

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”。

希望这有帮助。