DataGridView按列标题排序 – 使用通用列表

当我将List分配给DataGridView DataSource时,当我单击列标题时,没有任何反应,排序不起作用; 但是如果我使用DataTable作为数据源,那么当单击标题时,排序工作就很完美。

问题是:当我点击列标题时,应该使用哪种类型的集合类型来启用DataGridView排序,就像它与DataTable一起使用一样?

排序如何在数据绑定的DataGridView中工作

当您单击数据绑定DataGridView的列标题并启用其自动排序时,首先它会检查DataSource属性后面的列表是否为IBindingList ,然后使用SupportsSorting检查列表是否支持排序。 然后它调用ApplySort方法对列表进行排序。

当您使用DataTable作为网格的数据源时,数据源后面的列表实际上是一个DataView ,它实现支持排序的IBindingList

要在DataGridView自动支持排序,列表应该实现IBindingList及其与排序相关的成员。

在BindingList 中启用排序

要具有也支持排序的IBindingList类型化列表实现,一个好的选择是从BindingList派生。 它实现了IBindingList但默认情况下它不支持排序。 您可以覆盖与排序相关的方法和属性: SupportsSortingCoreIsSortedCoreSortPropertyCoreSortDirectionCoreApplySortCore

现有实施

有一些实现:

  • entity framework中使用的SortableBindingList实现。

  • SortableSearchableList ,发布在MSDN文章中

  • 如果您使用的是Entity Framework, ToBindingList DbSetLocal属性的ToBindingList方法将返回一个可排序的BindingList