当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))。我们将使用底层视图的排序而不是 Grid 排序。
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"}.Contains ...
中,可以设置以不同方式排序的列。其他列按照网格默认排序,或者可以创建另一种自定义排序。
注意:我有一个完全工作的示例,但我希望片段足够好。
substring({0}, 1, 2)
时,那应该返回什么?谢谢! - AlexString.Format("Convert( ...)"
的Scol2
的第一个表达式上,我收到了以下错误:输入字符串的格式不正确。
- AlexView.Table.Columns("Scol2").Expression = String.Format("Convert(Iif(substring({0},1,2) like '*-',substring({0},3,len({0})-1),{0}), 'System.Int32')", DataGridView1.Columns(e.ColumnIndex).Name)
- Alex