RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

VB(.net) Windows10 WinForms・DataGridViewのColumnHeaderのソートを示す三角だけ操作する

記のようなコードを実行した際、右側のカラムをクリックした際、ソートはされないがソートを示す三角形が「昇順→降順→ソートなし」の順に変化する。

コード

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

        '自動ソートを停止
        DataGridView1.Columns.Item(1).SortMode = DataGridViewColumnSortMode.Programmatic

    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)

            '※データの独自ソートを行いたい場合は、ここでデータのソートを実施


            'カラムヘッダーの矢印を現在のソート状態に合わせる
            vc.HeaderCell.SortGlyphDirection = sordOrder

        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

f:id:ys-soniclab:20190119215201p:plain
クリック一回目

f:id:ys-soniclab:20190119215217p:plain
クリック二回目

f:id:ys-soniclab:20190119215232p:plain
クリック三回目