DataGridView がデータバインドされている場合、その並べ替えを使用することはできず、ソース データを並べ替える必要があります。並べ替えは少し複雑なので、2 つのヘルパー列が必要です。
dgvBills.AutoGenerateColumns = False
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)))
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)))
最初のものには、先頭の文字 (または空の文字列) が含まれます。2 番目には、文字列に含まれる数値のみが含まれます。でソートし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"}.Contains ...
方法でソートされた列を設定することができます。他の列は、デフォルトでグリッドが並べ替えるように並べ替えられます。または、別のカスタム並べ替えを作成することもできます。
注:完全に機能する例がありますが、フラグメントで十分であることを願っています。