DataGridView行的排序方法
注意:DataGridView控件是从.NET
Framework 2.0版本开始追加的。
在这里介绍和通常排序不一样的排序方法。通常指定排序的方法有很多种。在DataGridView中实现排序的方法有,使用Sort对象指定IComparer方法、使用SortCompare事件的方法。DataGridView的DataSource属性中设定DataSource时,通过DataView.Sort属性设定排序的方法等。下面介绍几种经常使用的方法。
DataGridView.Sort对象的使用方法
这个方法在DataGridView的DataSource属性没有被设定,VirtualMode属笥为False时可以使用。
变更使用DataGridView.Sort方法排序的列,可以使用IComparer实现。下面的例子是最先和索引0号码的列比较,如果一样就继续和下一列比较,然后排序的代码。首先,作成IComparer的Interface实例化的类。
[VB.NET]
'Icomparer的Interface实例化,排序的方法定义的类
Public Class CustomComparer
Implements IComparer
Private sOrder As Integer
Private comparer As Comparer
Public Sub New(ByVal order As SortOrder)
Me.sOrder = IIf(order = SortOrder.Descending, -1, 1)
Me.comparer = New Comparer( _
System.Globalization.CultureInfo.CurrentCulture)
End Sub
'定义排序的方法
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare
Dim result As Integer = 0
Dim rowx As DataGridViewRow = CType(x, DataGridViewRow)
Dim rowy As DataGridViewRow = CType(y, DataGridViewRow)
'比较第一列的单元格的值,如果一样继续比较下一列
For i As Integer = 0 To rowx.Cells.Count - 1
result = Me.comparer.Compare( _
rowx.Cells(i).Value, rowy.Cells(i).Value)
If result <> 0 Then
Exit For
End If
Next i
'返回结果
Return result *
Me.sOrder
End Function
End Class
[VB.NET]
'以升序排序
DataGridView1.Sort(New CustomComparer(SortOrder.Ascending))
SortCompare事件的使用方法
这种方法也可以在DataGridView的DataSource属性没有设定,VirtualMode属性为False时使用。
SortCompare事件在DataGridView排序时对两个单元格的值比较时发生。这个事件是在DataGridViewColumn.SortMode属性为Automatic用户点击Header时、不使用IComparer触发DataGridView.Sort方法进行排序进行设定。
使用SortCompare事件处理器取得DataGridViewSortCompareEventArgs对象的CellValue1和CellValue2比较结果,如果CellValue1为大就是正整数,如果为CellValue2就是负整数,相等时SortResult属性被设定为0。而且Handled属性被设定为True。
下面的代码就是单元格的值变换为文字列时,根据长度排序的例子。
[VB.NET]
'DataGridView1的SortCompare事件处理器
Private
Sub DataGridView1_SortCompare(ByVal sender As Object, _
ByVal e As DataGridViewSortCompareEventArgs) _
Handles DataGridView1.SortCompare
'被指定单元格的值以文字列型取得
Dim str1 As String
If e.CellValue1 Is Nothing Then
str1 = ""
Else
str1 = e.CellValue1.ToString
End If
Dim str2 As String
If e.CellValue2 Is Nothing Then
str2 = ""
Else
str2 = e.CellValue2.ToString
End If
'引入结果
e.SortResult = str1.Length - str2.Length
'通知已经处理
e.Handled = True
End Sub
复数列排序时,可以使用DataGridViewSortCompareEventArgs对象的RowIndex1和とRowIndex2属性。从当前行的索引开始使用DataGridViewRow对象取得进行比较。
DataView.Sort属性的使用方法
在DataGridView的DataSource属性中设定DataSource时,可以使用DataView.Sort 属性、BindingSource.Sort属性 进行排序。下面介绍一下DataView.Sort属性的使用方法。
比如说,想Column1列为升序排序,Sort属性设定为”Column1
ASC”即可。降序排序时,设定为”Column1 DESC”即可。Column1和Column2进行排序时,”Column1, Column2
ASC”(或者”Column1 ASC, Column2 ASC”)即可。
下面的代码是DataGridView1中的DataTable被Bind时,Column1和Column2以升序排序的例子。
[VB.NET]
'取得在DataGridView1中被Bind的DataTable
Dim dt As DataTable = CType(DataGridView1.DataSource, DataTable)
'DataView取得
Dim dv As DataView = dt.DefaultView
'Column1和Column2以升序排序
dv.Sort = "Column1, Column2 ASC"
'
Column1和Column2以升序排序
DataGridView1.Columns("Column1").HeaderCell.SortGlyphDirection = SortOrder.Ascending
DataGridView1.Columns("Column2").HeaderCell.SortGlyphDirection = SortOrder.Ascending