如何对绑定到EF EntityCollection <T>的WinForms DataGridView进行排序

Ada*_*kis 5 c# datagridview winforms entity-framework-4 entitycollection

我正在尝试将WinForms DataGridView绑定到EntityCollection<T>EntityFramework4对象.麻烦的是,我无法弄清楚如何对其进行排序(自动).

我正在做的就是将BindingSource的DataSource属性设置为实体的集合.

MyBindingSource.DataSource = CurrentItem.InvoiceNotes;

我真的希望有一个简单的配置,我可以添加到它,以使其工作; 我真的不想将我的EF Collection包装在一个新的BindingList容器中.

Mar*_*ell 3

为了支持排序,源需要IBindingList在启用排序的情况下实现。令人烦恼的是,据我所知,唯一具有此功能的内置类型是DataView.

不过,一切并没有失去。您最好的选择是创建您的数据 - 或者更确切地说,创建互联网上作为示例的BindingList<T>众多子类之一。可以让你完成 90% 的任务 - 它只需要大约 3 个 (IIRC) 附加方法实现即可获得基本(一列)排序支持。BindingList<T>BindingList<T>

Dinesh Chandnani 早在 2005 年就写了一系列文章 ( http://blogs.msdn.com/b/dchandnani/archive/2005/03.aspx ),很好地解释了通过 BindingSource 进行绑定。它是在 EF 之前编写的,但它提供了一些很好的背景信息。这里有一个花絮:

当然你可以直接将DataGridView绑定到DataTable并绕过BindingSource,但是BindingSource有一定的优点:

  • 它公开了对列表进行排序、过滤列表等的属性,否则这将是一件很痛苦的事情。(即,如果您将 DataGridView 直接绑定到 DataTable,那么要对 DataTable 进行排序,您需要知道 DataTable 是一个 IListSource,它知道基础列表(即 DataView),并且可以对 DataView 进行排序、过滤等)。
  • 如果您必须设置主/子视图,那么 BindingSource 可以很好地做到这一点(更多详细信息请参阅我之前的文章)
  • 对数据表的更改被隐藏(也在我的上一篇文章中)