Windows 窗体 DataGridView 控件中的列排序模式

DataGridView 列具有三种排序模式。 每列的排序模式通过列的 SortMode 属性指定,该属性可以设置为以下 DataGridViewColumnSortMode 枚举值之一。

DataGridViewColumnSortMode 说明
Automatic 文本框列的默认值。 除非列标题用于进行选择,否则单击列标题会自动按此列对 DataGridView 进行排序,并显示一个指示排序顺序的字形。
NotSortable 非文本框列的默认值。 可以通过编程方式对该列进行排序;但是,它不用于排序,因此没有为排序字形保留空间。
Programmatic 可以通过编程方式对该列进行排序,并为排序字形保留了空间。

如果默认值为 NotSortable 的列包含可以有意义地进行排序的值,则可能想要更改该列的排序模式。 例如,如果数据库列包含表示项状态的数字,则可以通过将图像列绑定到数据库列来将这些数字显示为相应的图标。 然后,可以在 DataGridView.CellFormatting 事件的处理程序中将数字单元格值更改为图像显示值。 在这种情况下,将 SortMode 属性设置为 Automatic 将使用户能够对列进行排序。 自动排序将使用户能够对具有相同状态的项进行分组,即使与数字对应的状态没有自然顺序也是如此。 再如,复选框列中的自动排序可用于对处于相同状态的项进行分组。

无论 SortMode 设置如何,都可以按任何列或多列中的值以编程方式对 DataGridView 进行排序。 当想要提供自己的用户界面 (UI) 进行排序或想要实现自定义排序时,以编程方式排序非常有用。 提供自己的排序 UI 很有用,例如,当设置 DataGridView 选择模式以启用列标题选择时。 在这种情况下,虽然列标题不能用于排序,但仍希望标题显示相应的排序字形,因此可以将 SortMode 属性设置为 Programmatic

设置为以编程方式排序模式的列不会自动显示排序字形。 对于这些列,必须通过设置 DataGridViewColumnHeaderCell.SortGlyphDirection 属性自行显示字形。 如果希望灵活地自定义排序,则需要进行此设置。 例如,如果按多列对 DataGridView 进行排序,则可能希望显示多个排序字形,也可能希望不显示排序字形。

尽管可以按任何列以编程方式对 DataGridView 进行排序,但某些列(例如按钮列)可能不包含可以有意义地进行排序的值。 对于这些列,NotSortableSortMode 属性设置表示它永远不会用于排序,因此无需在标题中为排序字形保留空间。

DataGridView 进行排序时,可以通过检查 SortedColumnSortOrder 属性的值来确定排序列和排序顺序。 在自定义排序操作​​之后,这些值就没有意义了。 有关自定义排序的详细信息,请参阅本主题后面的“自定义排序”部分。

对同时包含绑定列和未绑定列的 DataGridView 控件进行排序时,无法自动维护未绑定列中的值。 要维护这些值,必须通过将 VirtualMode 属性设置为 true 并处理 CellValueNeededCellValuePushed 事件来实现虚拟模式。 有关详细信息,请参阅如何:在 Windows 窗体 DataGridView 控件中实现虚拟模式。 不支持在绑定模式下按未绑定列进行排序。

编程排序

可以编程方式对 DataGridView 进行排序,方法是调用其 Sort 方法。

Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载将 DataGridViewColumnListSortDirection 枚举值作为参数。 当按包含可以有意义地进行排序但你不想配置为自动排序的值的列进行排序时,此重载很有用。 当调用此重载并传入 SortMode 属性值为 DataGridViewColumnSortMode.Automatic 的列时,SortedColumnSortOrder 属性会自动设置,并且相应的排序字形会出现在列标题中。

注意

DataGridView 控件通过设置 DataSource 属性绑定到外部数据源时,Sort(DataGridViewColumn,ListSortDirection) 方法重载对未绑定的列不起作用。 此外,当 VirtualMode 属性为 true 时,可仅针对绑定列调用此重载。 要确定某列是否是数据绑定的列,请检查 IsDataBound 属性值。 不支持在绑定模式下对未绑定列进行排序。

自定义排序

可以通过使用 Sort 方法的 Sort(IComparer) 重载或处理 SortCompare 事件来自定义 DataGridView

Sort(IComparer) 方法重载将实现 IComparer 接口的类的实例作为参数。 当想要提供自定义排序时,此重载很有用;例如,当列中的值没有自然排序顺序或自然排序顺序不合适时。 在这种情况下,不能使用自动排序,但你可能仍希望用户通过单击列标题进行排序。 如果不使用列标题进行选择,则可以在 ColumnHeaderMouseClick 事件的处理程序中调用此重载。

注意

仅当 DataGridView 控件未绑定到外部数据源且 VirtualMode 属性值为 false 时,Sort(IComparer) 方法重载才起作用。 要针对绑定到外部数据源的列自定义排序,则必须使用该数据源提供的排序操作。 在虚拟模式下,必须为未绑定的列提供自己的排序操作。

要使用 Sort(IComparer) 方法重载,必须创建自己的实现 IComparer 接口的类。 此接口要求你的类实现 IComparer.Compare 方法,当调用 Sort(IComparer) 方法重载时,DataGridViewDataGridViewRow 对象作为输入传递给该方法。 使用该方法,你可以根据任何列中的值计算正确的行排序。

Sort(IComparer) 方法重载不会设置 SortedColumnSortOrder 属性,因此必须始终设置 DataGridViewColumnHeaderCell.SortGlyphDirection 属性才能显示排序字形。

作为 Sort(IComparer) 方法重载的替代方法,可以通过实现 SortCompare 事件的处理程序来提供自定义排序。 当用户单击配置为自动排序的列的标题或调用 Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载时,会发生此事件。 该事件针对控件中的每对行发生,使你能够计算它们的正确顺序。

注意

当设置 DataSource 属性或 VirtualMode 属性值为 true 时,不会发生 SortCompare 事件。

另请参阅