ヘッダークリックでソート(オーナードロー)

メモ:  Category:vb

El Tabelle Sheet 4.0J で項目(ヘッダー)を使用した並べ替えを行うようにします。

オーナードローを使用してヘッダーに三角を描画します。

ヘッダー

オーナードローとソート

ヘッダーのクリックによりソートを行うよう、イベントを実装します。

' ヘッダークリックイベント
AddHandler Sheet1.ColumnHeaders.HeaderClick, _
    AddressOf Sheet1ColumnHeaders_HeadersClick
' ソート種別
Private m_intSortOrder As Integer = GrapeCity.Win.ElTabelle.SortOrder.Descending
' ソート項目
Private m_intSortColumn As Nullable(Of Integer)

Private Sub Sheet1ColumnHeaders_HeadersClick(_
                     ByVal sender As Object, _
                     ByVal e As GrapeCity.Win.ElTabelle.ClickEventArgs)

    Dim objSortItem As GrapeCity.Win.ElTabelle.SortItem
    Dim objSortList(0) As GrapeCity.Win.ElTabelle.SortItem

    If Not m_intSortColumn.HasValue OrElse m_intSortColumn.Value <> e.Column Then

        objSortItem = New GrapeCity.Win.ElTabelle.SortItem( _
                              e.Column, False, _
                              GrapeCity.Win.ElTabelle.SortOrder.Ascending)

        m_intSortOrder = GrapeCity.Win.ElTabelle.SortOrder.Ascending
        m_intSortColumn = e.Column
        '配列にソートオブジェクトを追加する
        objSortList(0) = objSortItem
    Else
        If m_intSortOrder = GrapeCity.Win.ElTabelle.SortOrder.Ascending Then
            objSortItem = New GrapeCity.Win.ElTabelle.SortItem( _
                                  e.Column, False, _
                                  GrapeCity.Win.ElTabelle.SortOrder.Descending)
            m_intSortOrder = GrapeCity.Win.ElTabelle.SortOrder.Descending
        Else
            objSortItem = New GrapeCity.Win.ElTabelle.SortItem( _
                                  e.Column, False, _
                                  GrapeCity.Win.ElTabelle.SortOrder.Ascending)
            m_intSortOrder = GrapeCity.Win.ElTabelle.SortOrder.Ascending
        End If
        '配列にソートオブジェクトを追加する
        objSortList(0) = objSortItem
    End If

    'ソートを実行する
    Sheet1.Sort(objSortList)

End Sub

ヘッダーのオーナードローを行うように設定し、三角形を描画します。

' ヘッダーのオーナードローを設定
For i As Integer = 0 To objCTRL.ElTabelleMaxColumns - 1
    Sheet1.ColumnHeaders(i, 0).OwnerDraw = True
Next
Private Sub eltTaskList_DrawElement(ByVal sender As System.Object, _
ByVal e As GrapeCity.Win.ElTabelle.DrawElementEventArgs) _
Handles eltTaskList.DrawElement
    '列ヘッダの場合
    If e.Region = GrapeCity.Win.ElTabelle.SheetRegion.ColumnHeaders Then
        Dim borderMargin As Integer = 1
        Dim captionMargin As Integer = 2

        Dim Shadow As New SolidBrush(Color.FromKnownColor(KnownColor.Control))
        e.Graphics.FillRectangle(Shadow, e.Bounds)
        '3D効果の明るい線を描画する
        Dim whitePen As Pen = New Pen(Brushes.White, 1)
        Dim GrayPen As Pen = New Pen(Brushes.DimGray, 1)

        e.Graphics.DrawLine(GrayPen, New Point(e.Bounds.Right - 1, e.Bounds.Top), _
            New Point(e.Bounds.Right - 1, e.Bounds.Top + e.Bounds.Height))
        e.Graphics.DrawLine(whitePen, New Point(e.Bounds.Left, e.Bounds.Top), _
            New Point(e.Bounds.Left, e.Bounds.Top + e.Bounds.Height))
        '3D効果の暗い線を描画する
        e.Graphics.DrawLine(GrayPen, _
            New Point(e.Bounds.Left, e.Bounds.Top + e.Bounds.Height - borderMargin), _
            New Point(e.Bounds.Left + e.Bounds.Width, e.Bounds.Top + e.Bounds.Height - borderMargin))

        'キャプションを描画する
        Dim caption As String = _
            CType(sender, GrapeCity.Win.ElTabelle.Sheet).ColumnHeaders( _
                e.Range.LeftColumn, e.Range.TopRow).Caption
        Dim font As Font = _
            CType(sender, GrapeCity.Win.ElTabelle.Sheet).ColumnHeaders( _
                e.Range.LeftColumn, e.Range.TopRow).Font
        e.Graphics.DrawString(caption, font, Brushes.Black, _
            New PointF(e.Bounds.Left + captionMargin, e.Bounds.Top + captionMargin))


        ' ソーとアイコンの描画
        Dim intOffSet As Integer = CType((e.Bounds.Bottom - e.Bounds.Top) / 4, Integer)

        If m_intSortColumn.HasValue AndAlso m_intSortColumn.Value = e.Range.LeftColumn Then
            If m_intSortOrder = GrapeCity.Win.ElTabelle.SortOrder.Ascending Then
                e.Graphics.DrawLine(whitePen, _
                    New Point(e.Bounds.Right - (2 * intOffSet), intOffSet), _
                    New Point(e.Bounds.Right - intOffSet, e.Bounds.Bottom - intOffSet - 1))

                e.Graphics.DrawLine(whitePen, _
                    New Point(e.Bounds.Right - intOffSet, e.Bounds.Bottom - intOffSet - 1), _
                    New Point(e.Bounds.Right - (3 * intOffSet) - 2, e.Bounds.Bottom - intOffSet - 1))

                e.Graphics.DrawLine(GrayPen, _
                    New Point(e.Bounds.Right - (3 * intOffSet) - 1, e.Bounds.Bottom - intOffSet - 1), _
                    New Point(e.Bounds.Right - (2 * intOffSet), intOffSet - 1))
            Else
                e.Graphics.DrawLine(whitePen, _
                    New Point(e.Bounds.Right - intOffSet - 1, intOffSet), _
                    New Point(e.Bounds.Right - (2 * intOffSet) - 1, e.Bounds.Bottom - intOffSet))

                e.Graphics.DrawLine(GrayPen, _
                    New Point(e.Bounds.Right - (2 * intOffSet) - 2, e.Bounds.Bottom - intOffSet), _
                    New Point(e.Bounds.Right - (3 * intOffSet) - 1, intOffSet))

                e.Graphics.DrawLine(GrayPen, _
                    New Point(e.Bounds.Right - (3 * intOffSet) - 1, intOffSet), _
                    New Point(e.Bounds.Right - intOffSet - 1, intOffSet))
            End If
        End If

        Shadow.Dispose()
        whitePen.Dispose()
        GrayPen.Dispose()
    End If
End Sub

bluenote by BBB