DataGridView 列具有三种排序模式。 每个列的排序模式是通过列的 SortMode 属性指定的,该属性可以设置为以下 DataGridViewColumnSortMode 枚举值之一。
DataGridViewColumnSortMode 值 |
DESCRIPTION |
---|---|
Automatic | 文本框列的默认值。 除非列标题用于选择,否则单击列标题会自动按此列对 DataGridView 进行排序,并显示指示排序顺序的字形。 |
NotSortable | 非文本框列的默认值。 你可以以编程方式对此列进行排序;但是,它不适用于排序,因此没有为排序字形保留空格。 |
Programmatic | 你可以以编程方式对此列进行排序,并为排序字形保留空格。 |
如果列包含有意义的排序值,则可能需要更改默认为 NotSortable 的列的排序模式。 例如,如果数据库列包含表示项状态的数字,则可以通过将图像列绑定到数据库列来将这些数字显示为相应的图标。 然后,可以在 DataGridView.CellFormatting 事件的处理程序中将数值单元格的值转换为图像显示值。 在这种情况下,将 SortMode 属性设置为 Automatic 将使用户能够对列进行排序。 自动排序将使用户能够对具有相同状态的项目进行分组,即使与数字对应的状态没有自然序列。 复选框列是另一个示例,其中自动排序对处于相同状态的项进行分组很有用。
无论 DataGridView 设置如何,都可以按任何列或多列中的值以编程方式对 SortMode 进行排序。 当想要提供自己的用户界面(UI)进行排序或想要实现自定义排序时,编程排序非常有用。 提供自己的排序 UI 很有用,例如,当设置 DataGridView 选择模式以启用列标题选择时。 在这种情况下,虽然列标题不能用于排序,但仍希望标题显示适当的排序标志符号,因此将 SortMode 属性设置为 Programmatic。
设置为编程排序模式的列不会自动显示排序标志符号。 对于这些列,必须通过设置 DataGridViewColumnHeaderCell.SortGlyphDirection 属性自行显示字形。 如果需要灵活地进行自定义排序,则需要这样做。 例如,如果按多个列对 DataGridView 进行排序,您可能希望显示多个排序符号或不显示排序符号。
尽管你可以按任何列以编程方式对 DataGridView 进行排序,但某些列(如按钮列)可能不包含可以有意义排序的值。 对于这些列,将 SortMode 属性设置为 NotSortable 表示它永远不会用于排序的功能,因此无需在标题中保留空间给排序标志。
对 DataGridView 进行排序时,可以通过检查 SortedColumn 和 SortOrder 属性的值来确定排序列和排序顺序。 自定义排序操作后,这些值没有意义。 有关自定义排序的详细信息,请参阅本主题后面的“自定义排序”部分。
对包含绑定列和未绑定列的 DataGridView 控件进行排序时,无法自动维护未绑定列中的值。 若要维护这些值,必须通过将 VirtualMode 属性设置为 true
并处理 CellValueNeeded 和 CellValuePushed 事件来实现虚拟模式。 有关详细信息,请参阅 如何:在 Windows 窗体 DataGridView 控件中实现虚拟模式。 不支持按绑定模式下的未绑定列排序。
编程排序
可以通过调用 DataGridView 方法以编程方式对 Sort 进行排序。
Sort(DataGridViewColumn,ListSortDirection)
方法的 Sort 重载将 DataGridViewColumn 和 ListSortDirection 枚举值作为参数。 当按包含可以有意义地进行排序但你不想配置为自动排序的值的列进行排序时,此重载很有用。 调用此重载并传入 SortMode 属性值为 DataGridViewColumnSortMode.Automatic的列时,会自动设置 SortedColumn 和 SortOrder 属性,相应的排序符号将显示在列标题中。
注释
当 DataGridView 控件通过设置 DataSource 属性绑定到外部数据源时,Sort(DataGridViewColumn,ListSortDirection)
方法重载不适用于未绑定的列。 此外,当 VirtualMode 属性 true
时,只能对绑定列调用此重载。 若要确定列是否绑定数据,请检查 IsDataBound 属性值。 不支持在绑定模式下对未绑定列进行排序。
自定义排序
可以通过使用 DataGridView 方法的 Sort(IComparer)
重载或处理 Sort 事件来自定义 SortCompare。
Sort(IComparer)
方法重载将实现 IComparer 接口的类的实例作为参数。 如果要提供自定义排序,此重载非常有用;例如,当列中的值没有自然排序顺序或自然排序顺序不合适时。 在这种情况下,不能使用自动排序,但可能仍希望用户通过单击列标题进行排序。 如果不使用列标题进行选择,则可以在 ColumnHeaderMouseClick 事件的处理程序中调用此重载。
注释
仅当 Sort(IComparer)
控件未绑定到外部数据源且 DataGridView 属性值 VirtualMode时,false
方法重载才有效。 若要自定义绑定到外部数据源的列的排序,必须使用数据源提供的排序操作。 在虚拟模式下,必须为未绑定列提供自己的排序操作。
若要使用 Sort(IComparer)
方法重载,必须创建自己的实现 IComparer 接口的类。 此接口要求你的类实现 IComparer.Compare 方法,当调用 DataGridView 方法重载时,DataGridViewRow 将 Sort(IComparer)
对象作为输入传递给该方法。 为此,可以根据任何列中的值计算正确的行顺序。
Sort(IComparer)
方法重载未设置 SortedColumn 和 SortOrder 属性,因此必须始终设置 DataGridViewColumnHeaderCell.SortGlyphDirection 属性以显示排序标志符号。
作为 Sort(IComparer)
方法重载的替代方法,可以通过为 SortCompare 事件实现处理程序来提供自定义排序。 当用户单击配置为自动排序的列的标题或调用 Sort(DataGridViewColumn,ListSortDirection)
方法的 Sort 重载时,会发生此事件。 该事件针对控件中的每对行发生,使你能够计算它们的正确顺序。
注释
设置 SortCompare 属性或 DataSource 属性值 VirtualMode时,不会发生 true
事件。