关于DataGridView控件中的数据排序

Windows 窗体 DataGridView 控件中的列排序有三种模式,通过每一列的SortMode属性修改,改属性是DataGridViewColumnSortMode的枚举值之一。

DataGridViewColumnSortMode枚举:

  1.Automatic:文本框的默认排序方式。除非将列表头用于选择,否则单击列表头会对相应的列进行排序。

  2.NotSortable:非文本框的默认排序方式。可以以编程方式对此列进行排序;未为排序标志符号保留空间。

  3.Programmatic:可以以编程方式对此列排序,而且为排序标志符号保留空间。

以编程方式进行排序:

  可以通过调用 DataGridViewSort 方法以编程方式对其排序。

  Sort方法的Sort(DataGridViewColumn,ListSortDirection) 重载采用 DataGridViewColumn 和ListSortDirection 枚举值作为参数。当按列值可以有意义地排序(但不想将该列配置为用于自动排序)的列排序时,此重载很有用。当调用此重载并传入具有 DataGridViewColumnSortMode.Automatic的SortMode属性值的列时,会自动设置SortedColumn和SortOrder属性并在列标头中显示相应的排序标志符号。

  注意:当通过设置 DataSource 属性将 DataGridView 控件绑定到外部数据源时,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 事件。

posted @ 2011-02-22 22:22  BigPei  阅读(2375)  评论(0编辑  收藏  举报