OwnerDraw je při startu nastaveno na True. Sloupce mám 4. Předpokládám, že ListView1_DrawColumnHeader se provádí při každým překreslení a myslím si, že změna prvků vyvolá překreslení celý komponenty. Tím vykreslením úplně na vrch jsem myslel, že se vykreslí systemový styl a přes to vykreslím něco já. ještě doplním, že pro třídění používám třídu ListViewItemComparer http://vbnet.cz/forum-tema--1475-upraven... tady je celý kód:
Public Class Form1
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
Dim itemSorter = DirectCast(ListView1.ListViewItemSorter, ListViewItemComparer)
itemSorter.Column = e.Column
itemSorter.SortOrder *= -1
ListView1.Sort()
ListView1.Refresh()
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ListView1.ListViewItemSorter = New ListViewItemComparer(0)
End Sub
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
e.DrawDefault = True
Dim sorter As ListViewItemComparer = ListView1.ListViewItemSorter
If sorter.SortOrder = 0 Then Exit Sub
Dim colWidth As Integer = -20
For i As Integer = 0 To sorter.Column
colWidth += ListView1.Columns(i).Width
Next
Dim Asc As Point() = {New Point(colWidth, 11), New Point(colWidth + 10, 11), New Point(colWidth + 5, 5)}
Dim Desc As Point() = {New Point(colWidth, 6), New Point(colWidth + 10, 6), New Point(colWidth + 5, 11)}
Dim dic As New Dictionary(Of Integer, Point())
dic.Add(-1, Desc)
dic.Add(1, Asc)
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
e.Graphics.FillPolygon(Brushes.DimGray, dic(sorter.SortOrder))
End Sub
Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
e.DrawDefault = True
End Sub
Private Sub ListView1_DrawSubItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
e.DrawDefault = True
End Sub
End Class
Můžete si vyzkoušet, že takhle to funguje, ALE... nevím proč, v posledním sloupci se prostě nevykreslí. A myslím že je tady ještě jedno ale, předpokládám, že při refreshi se překreslí hlavičky všech sloupců, takže se při každém překreslení vykreslí 4x do jednoho místa. Když jsem to chtěl omezit jen na jeden sloupec a dal jsem za e.DrawDefault = True tuhle podmínku, tak se nevykreslí už vůbec nic
If e.ColumnIndex <> sorter.Column Then Exit Sub
|