ヘッダークリックでソート(オーナードロー)
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