XtraGrid绑定继承的对象

本文关键字:对象 继承 绑定 XtraGrid | 更新日期: 2023-09-27 18:19:33

我有一个基类和两个继承类。根据应用程序的配置,必须将Customer1或Customer2绑定到XtraGrid:

public abstract class MyBase
{
    public int ItemID { get; set; }
}
public class Customer1 : MyBase
{
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}
public class Customer2 : MyBase
{
    public string Name { get; set; }
}

现在,绑定代码:

    Customer1 c1 = new Customer1();
    c1.ItemID = 1;
    c1.Name = "N1";
    c1.BirthDate = DateTime.Now;
    BindingList<MyBase> tmpList = new BindingList<MyBase>();
    tmpList.Add(c1);
    gridControl1.DataSource = tmpList;

但是网格只显示从MyBase类派生的ItemID字段。

你能帮忙吗?

谢谢。

XtraGrid绑定继承的对象

简单的答案是-你不能这么做。这不是XtraGrid特有的,而是所有使用列表数据绑定的控件特有的。当您使用List<T>BindingList<T>等时,(T)的类型将被提取并用作检索可绑定属性的项类型。请注意,这些类(以及通常的IList<T>)都不支持方差,因此不能将基类用作泛型参数。在实例化List/BindingList时只需使用具体类,您计划将其用作数据源(在您的情况下为BindingList<Customer1>BindingList<Customer2>)。

您在网格中只看到ItemID字段,因为您已将基类MyBase添加为BindingList的类型。

您应该在代码中将BindingList的类型更改为Customer1Customer2

Customer1 c1 = new Customer1();
c1.ItemID = 1;
c1.Name = "N1";
c1.BirthDate = DateTime.Now;
BindingList<Customer1> tmpList = new BindingList<Customer1>();
tmpList.Add(c1);
gridControl1.DataSource = tmpList;

使用基类MyBase将Customer类的视图限制为基类中可用的视图。因此网格只能看到ItemID字段。

您将无法将Customer1Customer2类型的集合绑定到网格。你需要重新思考你的解决方案。您可以创建一个包含Customer1Customer2中所有字段的类(让我们称之为Customer),还可以添加一个额外的字段,可能是一个枚举,用于设置客户类型(即Customer1或Customer2)。然后你可以创建这样的绑定:

public enum CustomerType
{
    Customer1,
    Customer2
}
public class Customer
{
    public int ItemID { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
    public CustomerType Type {get; set; }
}
Customer c = new Customer();
c.ItemID = 1;
c.Name = "N1";
c.BirthDate = DateTime.Now;
c.Type = CustomerType.Customer1;
BindingList<Customer> tmpList = new BindingList<Customer>();
tmpList.Add(c);
gridControl1.DataSource = tmpList;

然后,您的网格将能够显示您感兴趣的所有字段。

感谢您抽出时间。

我刚刚尝试了UnBound列类型并解决了问题。