繁体   English   中英

将派生类添加到 DataGridView 的绑定源

[英]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)。

如果尚未设置BindingSourceDataSource属性,则添加到列表中的第一个对象定义列表的类型,然后您要添加到列表中的所有项目都应该是第一个对象的类型,因为内部列表必须包含文档中提到的同类类型。

不是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM