[英]Adding derived classes to a Binding Source of a DataGridView
使用 C# 在 WinForms 中使用 MVC 模式
三个业务对象 - 一个抽象的 LibraryItem 类、一个 Book 类和一个 Journal 类,它们都派生自 LibraryItem
//LibraryItem Class
public abstract class LibraryItem
{
public string Title { get; set; }
private static int _nextCallNum = 1000;
public int CallNum { get; private set; }
public int NumCopies { get; set; }
}
//Journal Class
public class Journal : LibraryItem
{
public int Vol { get; set; }
}
//Book Class
public class Book : LibraryItem
{
public string Author { get; set; }
}
//LibraryController Class
public class LibrayController
{
//a List that can hold both books and journals
private List<LibraryItem> items;
//adds a book object to items
public void AddBookItem(string title, int numCopies , string author) {.....}
//adds a journal object to items
public void AddJournal(string title, int vol, int numCopies){}
//returns a List contaning books and journals to the View
public List<LibraryItem> GetAllItems()
{
return items;
}
}
在 Win Forms 中,使用 DataGridView 显示 LibraryItems 列表
dataGridViewItems.DataSource = null;
booksbindingSource = new BindingSource();
foreach (LibraryItem anitem in controller.GetAllItems())
{
LibraryItem aLibraryItem = (LibraryItem) anitem;
booksbindingSource.Add(aLibraryItem);
}
dataGridViewItems.DataSource = booksbindingSource;
在将一本书后添加一本书或一本书后添加到绑定源时,我得到InvalidOperationException 添加到 BindingSource 列表的对象必须全部为相同类型。
该描述是不言自明的。 我需要一种在数据网格中显示 LibraryItems 的方法,而不是书籍和期刊。 我只需要在数据网格中显示基类属性(LibraryItem 的Title、CallNum 和NumCopies)。
如果尚未设置BindingSource
的DataSource
属性,则添加到列表中的第一个对象定义列表的类型,然后您要添加到列表中的所有项目都应该是第一个对象的类型,因为内部列表必须包含文档中提到的同类类型。
不是使用Add
方法向BindingSource
添加项目,而是将其DataSource
属性设置为您从控制器获取的列表:
var bs = new BindingSource();
var list = controller.GetAllItems();
bs.DataSource = list;
this.dataGridView1.DataSource = bs;
笔记
要解决这个问题,就足够了,推荐使用上述方法,但要查看设置DataSource
,您可以将DataSource
属性设置为typeof(LibraryItem)
,您将看到它也按预期工作:
bs.DataSource = typeof(LibraryItem);
foreach (var item in list)
{
bs.Add(item);
}
this.dataGridView1.DataSource = bs;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.