XtraGrid绑定继承对象

时间:2015-10-27 17:09:08

标签: c# binding xtragrid derived

我有一个基类和2个继承的类。根据应用程序的配置,必须将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;

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

你能帮忙吗?

感谢。

3 个答案:

答案 0 :(得分:1)

简单的答案是 - 你做不到。这不是List<T>特有的,而是针对使用列表数据绑定的所有控件。当您使用BindingList<T>IList<T>等时,将提取typeof(T)并将其用作项类型以检索可绑定属性。请注意,这些类(以及一般BindingList<Customer1>)都不支持方差,因此您不能将基类用作通用参数。只需在实例化您计划用作数据源的List / BindingList时使用具体类(在您的情况下为BindingList<Customer2>var i; for (i = 1; i <= lastRowID; i++;) { var element = document.getElementById('txtName'+i); if (typeof(element) != 'undefined' && element != null) { // control with this ID exists. } else { // control with this ID does NOT exist, SKIP it. } } )。

答案 1 :(得分:0)

您只在网格中看到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),并添加一个设置客户类型的附加字段(可能是枚举)(即。客户1或客户2)。然后你可以像这样创建一个绑定:

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;

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

答案 2 :(得分:0)

感谢您的时间。

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