从DataGridView数据源类型转换BindingList

本文关键字:BindingList 类型转换 数据源 DataGridView | 更新日期: 2023-09-27 18:19:09

我有接口IDoc和一个实现它的抽象类Doc。然后,我有一个名为BookDoc的类继承自Doc,另一个类JournalDoc也继承自Doc。

现在我想做的是绑定BindingList<BookDoc>BindingList<JournalDoc>到自定义DataGridView。然后,我希望能够访问一个Errors属性,它们都继承自Doc类。

半工作示例:

var dataSource = this.DataSource as BindingSource;
BindingList<BookDoc> tempBookDocs = dataSource.DataSource as BindingList<BookDoc>;
var Docs = new List<IDoc>();
foreach (var tempDoc in tempBookDocs)
{
    Docs.Add(tempDoc);
}

上面的例子工作了,我得到了一个填充的文档列表,我可以访问Errors属性,但仍然需要硬编码最初绑定的列表类型。

我想做的是这样的事情,虽然我不确定这是否可能。

var dataSource = this.DataSource as BindingSource;
BindingList<Doc> Docs = dataSource.DataSource as BindingList<Doc>;

这给了我一个空文档列表。

从DataGridView数据源类型转换BindingList

如果您正在使用。net 4.0,您可以使用IEnumarable<>:

利用协方差:
IEnumarable<Doc> tempBookDocs = dataSource.DataSource as IEnumarable<Doc>;
var Docs = new List<IDoc>();
foreach (var tempDoc in tempBookDocs)
{
    Docs.Add(tempDoc);
}

如果你使用的是。net 3.5,你可以使用LINQ OfType扩展方法:

IEnumarable<Doc> myDocs = ((IEnumarable)dataSource.DataSource).OfType<Doc>();
var Docs = new List<IDoc>();
foreach (var tempDoc in myDocs)
{
    Docs.Add(tempDoc);
}