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
特有的,而是所有使用列表数据绑定的控件特有的。当您使用List<T>
、BindingList<T>
等时,(T)的类型将被提取并用作检索可绑定属性的项类型。请注意,这些类(以及通常的IList<T>
)都不支持方差,因此不能将基类用作泛型参数。在实例化List/BindingList时只需使用具体类,您计划将其用作数据源(在您的情况下为BindingList<Customer1>
或BindingList<Customer2>
)。
您在网格中只看到ItemID
字段,因为您已将基类MyBase
添加为BindingList
的类型。
您应该在代码中将BindingList
的类型更改为Customer1
或Customer2
。
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
字段。
您将无法将Customer1
和Customer2
类型的集合绑定到网格。你需要重新思考你的解决方案。您可以创建一个包含Customer1
和Customer2
中所有字段的类(让我们称之为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列类型并解决了问题。