我结合的IList到GridView。 IMyInterface的样子

public interface IMyInterface: IHasTotalHours, IHasLines
{
    DateTime GoalStartDate { get; set; }
    DateTime GoalEndDate { get; set; }
}

我一个实例绑定到这样的网格:

IList<IMyInterface> instance= GetMyData();

myGrid.DataSource = instance;
myGrid.DataBind();

当此结合到电网,即在网格中显示的唯一成员是IMyInterface的直接成员:GoalStartDate和GoalEndDate

这是为什么?我如何获得格来显示它继承?

其他接口的成员

<强>更新 继承的接口定义等

简单的数据属性
public interface IHasTotalHours
{
    string Description { get; set; }
    int Hours{ get; set; }
}
public interface IHasLines
{
    double TotalLines { get; set; }
    double LinesPerHour { get; set; }
}

有是实现IMyInterface的一类:

public class MyClass : IMyInterface
{
    public string Description { get; set; }
    public int Hours { get; set; }
    public double TotalLines { get; set; }
    public double LinesPerHour { get; set; }
    public DateTime GoalStartDate { get; set; }
    public DateTime GoalEndDate { get; set; }

}

这些被铸造成IMyInterface的,并且在我结合到GridView列表中返回。

有帮助吗?

解决方案

数据绑定控件不使用反射而是TypeDescriptor从数据源获取的属性。在 TypeDescriptor.GetProperties 方法,可以阅读以下内容:

  

要组分的性质可以   从一个类的属性不同,   因为该网站可以添加或删除   属性如果组件选址。

显然,缺省实现将只从一个接口返回的直接属性,而不是继承的。

幸运的是这机制是可扩展的,并且可以编写一个的TypeConverter 类自定义属性信息的实现。请参考的TypeConverter文档在备注栏用于实现属性的逻辑。

在实施的GetProperties自定义类型转换器类的可以在界面上调用TypeDescriptor.GetProperties(类型)和所有它继承的接口。但是,也许你甚至可以编写一个通用的类型转换器,将通过使用反射找到所有继承属性。

然后您将这个自定义类型转换器与TypeConverterAttribute属性的界面。

然后,如魔术,数据源会发现的所有属性。 ; - )

其他提示

这是因为一个接口是一个合同,这是与对象进行交互的唯一方式是通过该特定的合同。其它接口不能假定,并且不能被利用,直到铸造而成。

所以,当你T的列表绑定到的东西,在DataGrid不知道这些其他接口。同时DataGrid将不会使用反射来找出其他类或接口可能被继承。该将要提供给数据网格的唯一对象属性是由T接口公开的属性。

您需要,如果你想在DataGrid能够访问所有属性绑定列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top