ListView je připraven na implementaci vlastního řazení bez jakékoliv modifikace. Stačí si implementovat vlastní IComparer a přiřadit jeho instanci do vlastnosti ListViewItemSorter. Na událost ColumnClick potom měníte způsob řazení, případně obrázek se šipkou. Následující příklad ukazuje IComparer jak jsem ho implementoval já pro svoje účely řazení v ListView:
Public Class ListViewItemComparer
Implements IComparer
Private _columnIndex As Integer
Private _sortOrder As SortOrder
Public Sub New(ByVal columnIndex As Integer)
Me.New(columnIndex, SortOrder.Ascending)
End Sub
Public Sub New(ByVal columnIndex As Integer, ByVal sortOrder As SortOrder)
If columnIndex < 0 Then
Throw New ArgumentOutOfRangeException("columnIndex")
End If
_columnIndex = columnIndex
_sortOrder = sortOrder
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim value1 = DirectCast(x, ListViewItem).SubItems(_columnIndex).Text
Dim value2 = DirectCast(y, ListViewItem).SubItems(_columnIndex).Text
If IsNumeric(value1) AndAlso IsNumeric(value2) Then
Return CDbl(value1).CompareTo(CDbl(value2)) * _sortOrder
Else
Return value1.CompareTo(value2) * _sortOrder
End If
End Function
Public Property SortOrder() As SortOrder
Get
Return _sortOrder
End Get
Set(ByVal value As SortOrder)
_sortOrder = value
End Set
End Property
Public Property Column() As Integer
Get
Return _columnIndex
End Get
Set(ByVal value As Integer)
_columnIndex = value
End Set
End Property
End Class
Použití:
'Nastavit výchozí vzestupné řazení podle prvního sloupce
ListView1.ListViewItemSorter = New ListViewItemComparer(0)
Změna řazení (vzestupně/sestupně) klepnutím na záhlaví sloupce (načtení obrázku si tam dopište sám, je to primitivní, inspirovat se můžete zde: http://www.vbnet.cz/forum-tema--817-sort... ):
Private Sub ListView1_ColumnClick(ByVal sender As System.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()
End Sub
|