VB(.net) Windows10 WinForms・DataGridViewのカラムクリック時、「昇順→降順→ソートなし」の順となるようカスタム
デフォルトのDataGridViewはカラムをクリックすると、「昇順→降順」の順にソートされる。 この挙動を、「昇順→降順→ソートなし」となるようカスタムする。 下記例では、右側のカラムのみカスタムが実装される。
Imports System.ComponentModel Public Class Form1 'ソートの状態を保存する変数 Dim sordOrder As SortOrder = SortOrder.None Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load '以下はDataGridViewのデータ表示用コード Dim table As DataTable = New DataTable() table.Columns.Add("col1") table.Columns.Add("col2") table.Rows.Add({1, 1}) table.Rows.Add({2, 2}) table.Rows.Add({4, 4}) table.Rows.Add({3, 3}) DataGridView1.DataSource = table End Sub Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick '右側のカラムでのみ、「ソートなし」処理を実装 If e.ColumnIndex = 1 Then Dim vc As DataGridViewColumn = DataGridView1.Columns.Item(e.ColumnIndex) 'すでにソート中であれば、次のソート状態を保持 sordOrder = GetNextOrder(sordOrder) If sordOrder = SortOrder.None Then 'ソート状態をリセット DataGridView1.DataSource.DefaultView.Sort = String.Empty Else 'ソートを実行 DataGridView1.Sort(vc, IIf(sordOrder = SortOrder.Ascending, ListSortDirection.Ascending, ListSortDirection.Descending)) End If End If End Sub 'ソート順を受け取り、次のソート順を返す Private Function GetNextOrder(sortOrder As SortOrder) As SortOrder Dim rtn As SortOrder Select Case sortOrder Case SortOrder.Ascending rtn = SortOrder.Descending Case SortOrder.Descending rtn = SortOrder.None Case SortOrder.None rtn = SortOrder.Ascending End Select Return rtn End Function End Class