如何允许在自定义数据绑定中按多列排序
描述了当数据源是对象列表时,如何在 DataGridView 中实现按多列排序的可能性。
引言
当您将 DataGridView
绑定到自定义业务对象时,您可能希望允许按列或多列进行排序。您可以使用 BindingSource
来绑定您的数据,但此组件未实现排序功能。
如果您只需要按一列排序,可以使用文章中描述的 SortableBindingList
:自定义数据绑定,第 2 部分。
但此处使用的技术不允许按多列排序。本文介绍如何以简单快速的方式添加排序功能。
背景
当您希望将 DataGridView
绑定到您的业务逻辑对象时,通常需要三个步骤
- 在设计时:为您的对象创建指定的
DataSource
类型(通过在菜单中选择“数据-添加新数据源”,并通过指定您的自定义对象作为字段源;有关更多详细信息,请参见自定义数据绑定,第 1 部分)。 - 在设计时:创建
BindingSource
组件并为其DataSource
属性指定已创建的DataSource
。 - 在运行时:创建指定类型的列表,并将其分配给
BindingSource
组件的DataSource
属性。
在这种情况下,您不能使用 BindingSource.Sort
属性,因为您的 List<...>
将被自动转换为 BindingList<...>
。 要允许多列排序,DataSource
应该实现 IBindingListView
接口,但是创建的 BindingList<...>
没有实现它(您可以在 BindinList
实现中看到)
public class BindingList<T> : Collection<T>, IBindingList, IList,
ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents
因此,我们需要实现 IBindingListView
才能按一列或多列进行排序。然后,您可以通过指定列名和排序方向并使用逗号分隔符来使用 BindingSource
的 Sort
属性,例如。
BindingSource.Sort = "Column1 ASC, Column2 DESC, Column 3 ASC";
所以,我创建了 MultipleSortableBindingListView
类来实现 IBindingListView
接口
public class MultipleSortableBindingListView<T> : BindingList<T>, IBindingListView
Using the Code
让我们假设我们有一个 Person
类和要在 DataGridView
上显示的对象列表
public class Person {...}
public List<Person> list = ...;
现在您应该使用 MultipleSortableBindingListView<Person>
而不是 List<Person>
。 如您所见,BindingList
(和 MultipleSortableBindingListView
也) 实现了 IList
。 因此,您无需更改您的逻辑来创建要显示的 Persons
列表:我们的新类具有与 List
类相同的方法。
下一步就是享受! 现在,当 BindingSource.DataSource
被分配给列表变量时,将使用 MultipleSortableBindingListView<...>
,并且您可以享受 BindingSource
组件的 Sort
属性。 它有效!
关注点
我使用了自定义数据绑定,第 2 部分中的 PropertyComparer
类,并且我几乎没有更改它以允许比较不同的基本值和引用类型属性。
下一步...
下一个好主意是从自定义数据绑定,第 3 部分向我们的类添加过滤功能(如果您需要它)。
历史
- 2007 年 8 月 5 日:首次发布