DataGridView按列标题排序 – 使用通用列表
当我将List
分配给DataGridView
DataSource
时,当我单击列标题时,没有任何反应,排序不起作用; 但是如果我使用DataTable
作为数据源,那么当单击标题时,排序工作就很完美。
问题是:当我点击列标题时,应该使用哪种类型的集合类型来启用DataGridView
排序,就像它与DataTable
一起使用一样?
排序如何在数据绑定的DataGridView中工作
当您单击数据绑定DataGridView
的列标题并启用其自动排序时,首先它会检查DataSource
属性后面的列表是否为IBindingList
,然后使用SupportsSorting
检查列表是否支持排序。 然后它调用ApplySort
方法对列表进行排序。
当您使用DataTable
作为网格的数据源时,数据源后面的列表实际上是一个DataView
,它实现支持排序的IBindingList
。
要在DataGridView
自动支持排序,列表应该实现IBindingList
及其与排序相关的成员。
在BindingList
要具有也支持排序的IBindingList
类型化列表实现,一个好的选择是从BindingList
派生。 它实现了IBindingList
但默认情况下它不支持排序。 您可以覆盖与排序相关的方法和属性: SupportsSortingCore
, IsSortedCore
, SortPropertyCore
, SortDirectionCore
和ApplySortCore
。
现有实施
有一些实现:
-
entity framework中使用的
SortableBindingList
实现。 -
SortableSearchableList
,发布在MSDN文章中 -
如果您使用的是Entity Framework,
ToBindingList
DbSet
的Local
属性的ToBindingList
方法将返回一个可排序的BindingList
。