65.9K
CodeProject 正在变化。 阅读更多。
Home

如何允许在自定义数据绑定中按多列排序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (6投票s)

2007年8月5日

CPOL

2分钟阅读

viewsIcon

96924

downloadIcon

2482

描述了当数据源是对象列表时,如何在 DataGridView 中实现按多列排序的可能性。

引言

当您将 DataGridView 绑定到自定义业务对象时,您可能希望允许按列或多列进行排序。您可以使用 BindingSource 来绑定您的数据,但此组件未实现排序功能。

如果您只需要按一列排序,可以使用文章中描述的 SortableBindingList自定义数据绑定,第 2 部分

但此处使用的技术不允许按多列排序。本文介绍如何以简单快速的方式添加排序功能。

背景

当您希望将 DataGridView 绑定到您的业务逻辑对象时,通常需要三个步骤

  1. 在设计时:为您的对象创建指定的 DataSource 类型(通过在菜单中选择“数据-添加新数据源”,并通过指定您的自定义对象作为字段源;有关更多详细信息,请参见自定义数据绑定,第 1 部分)。
  2. 在设计时:创建 BindingSource 组件并为其 DataSource 属性指定已创建的 DataSource
  3. 在运行时:创建指定类型的列表,并将其分配给 BindingSource 组件的 DataSource 属性。

在这种情况下,您不能使用 BindingSource.Sort 属性,因为您的 List<...> 将被自动转换为 BindingList<...>。 要允许多列排序,DataSource 应该实现 IBindingListView 接口,但是创建的 BindingList<...> 没有实现它(您可以在 BindinList 实现中看到)

public class BindingList<T> : Collection<T>, IBindingList, IList, 
	ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents

因此,我们需要实现 IBindingListView 才能按一列或多列进行排序。然后,您可以通过指定列名和排序方向并使用逗号分隔符来使用 BindingSourceSort 属性,例如。

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 日:首次发布
© . All rights reserved.