我的DataGridView的DataSource绑定到DataView. DataView等于我的dtBills DataTable.像这样:
Dim View As New DataView
View.Table = DataSet1.Tables("dtBills")
dgvBills.DataSource = View
我在这个DataGridView中有多个列.一个特别是字符串和整数作为信息.当我单击DataGridView列标题对列进行排序时,它会像左边的列一样排序为字符串:
'Curr Col >>> ' Wanted Result
10001 >>> 10001
100012 >>> 11000
11000 >>> 12000
110049 >>> 100012
12000 >>> 110049
E-1234 >>> E-1234
T-12345 >>> T-1235
T-1235 >>> T-12345
当我按常用的方式按下列标题时,如何对绑定的DataGridView列进行排序?我应该使用DataView来帮助我吗?
最佳答案 当DataGridView是数据绑定时,无法使用其排序,因此需要对源数据进行排序.排序有点复杂,所以我需要两个辅助列.
dgvBills.AutoGenerateColumns = False
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)))
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)))
第一个将包含一个前导字母(或空字符串).第二个只包含字符串中包含的数字.我们将按Scol1,Scol2排序.
现在我们将所有列设置为Programatic模式(DataGridViewColumnSortMode Enumeration)
For Each column As DataGridViewColumn In dgvBills.Columns
column.SortMode = DataGridViewColumnSortMode.Programmatic
Next
并且在ColumnHeaderMouseClick(DataGridView.Sort Method (IComparer))的处理程序中实现自定义排序.我们将使用基础视图的排序而不是网格排序.
Private Sub dgvBills_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvBills.ColumnHeaderMouseClick
Dim newColumn As DataGridViewColumn = dgvBills.Columns(e.ColumnIndex)
Dim direction As ListSortDirection
Dim Modifier As String = ""
If newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending Then
direction = ListSortDirection.Descending
Modifier = " desc"
Else
direction = ListSortDirection.Ascending
End If
Dim View As DataView = dgvBills.DataSource
If {"JobNumber", "JobNumber1"}.Contains(dgvBills.Columns(e.ColumnIndex).Name) Then
View.Table.Columns("Scol2").Expression = String.Format("Convert(iif (substring({0},1,2) like '*-',substring({0},3,len({0})-1),{0}), 'System.Int32')", dgvBills.Columns(e.ColumnIndex).Name)
View.Table.Columns("Scol1").Expression = String.Format("iif (substring({0},1,2) like '*-',substring({0},1,2),'')", dgvBills.Columns(e.ColumnIndex).Name)
View.Sort = String.Format("Scol1 {0},Scol2 {0}", Modifier)
Else
dgvBills.Sort(newColumn, direction)
End If
If direction = ListSortDirection.Ascending Then
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending
Else
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending
End If
End Sub
在{“JobNumber”,“JobNumber1”}.包含…可以设置不同排序的列.对其他列进行排序,因为Grid默认对它们进行排序,或者可以创建另一个自定义排序.
注意:我有完整的工作示例,但我希望片段足够好.