使DataGridView在使用基类对象列表时显示派生类对象的属性

本文关键字:对象 派生 属性 显示 列表 DataGridView 基类 | 更新日期: 2023-09-27 18:21:50

如果成员位于基类类型的列表中,而该列表中不存在属性,是否有任何方法可以让DataGridView显示派生类的属性?假设我有以下内容:

public class MyBaseClass
{
public int MyPropertyBase { get; set; }
//...
}
public class MyDerivedClass : MyBaseClass
{
public int MyPropertyDerived { get; set; }
//...
}
// Create list of type MyBaseClass, holding MyDerivedClass objects
List<MyBaseClass> list = new List<MyBaseClass>();
list.Add(new MyDerivedClass(1));
list.Add(new MyDerivedClass(2));
list.Add(new MyDerivedClass(3));
// Declare DataGridView
DataGridView dataGridView = new DataGridView();
dataGridView.AutoGenerateColumns = false;
// Create display column for DataGridView
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();

当我将列表绑定到DataGridView并显示MyPropertyBase属性时,它运行良好:

// Select MyPropertyBase to display in column
col.DataPropertyName = "MyPropertyBase";
dataGridView.Columns.Add(col);
dataGridView.DataSource = list;

但是,如果我想使用相同的List<MyBaseClass>显示MyPropertyDerived,它将不起作用,只显示空单元格(尽管它显示了与列表中项目对应的单元格数量):

// Select MyPropertyDerived to display in column
col.DataPropertyName = "MyPropertyDerived";
dataGridView.Columns.Add(col);    
dataGridView.DataSource = list;

我真的需要把这个列表输入到我的抽象基类中,因为它在代码的其他地方都被使用。如果派生类属性存在,是否有任何方法将其公开给DataGridView,如果该属性不存在,则只显示并清空单元格?真正有用的是让每个派生类在绑定到DataGridView时公开(可能通过属性)它们想要显示的所有内容,并让DataGridView从列表中填充自己。

使DataGridView在使用基类对象列表时显示派生类对象的属性

一种方法是回滚列表中的每个元素,进行下一次更改,您将在datagridview中得到1,2,3:

col.DataPropertyName = "MyPropertyDerived";
dataGridView.Columns.Add(col);
dataGridView.DataSource = list.ConvertAll(c => c as MyDerivedClass);

如果实现ITypedList并修改方法GetItemProperties的返回,则可以绕过数据绑定CurrencyManager 的限制