Utilizzo la seguente classe per ordinare gli elementi di una ListView:
codice:
Public Class ListViewColumnSorter
Implements System.Collections.IComparer
Private ColumnToSort As Integer
Private OrderOfSort As SortOrder
Private ObjectCompare As CaseInsensitiveComparer
Public Sub New()
' Initialize the column to '0'.
ColumnToSort = 1
' Initialize the sort order to 'none'.
OrderOfSort = SortOrder.None
' Initialize the CaseInsensitiveComparer object.
ObjectCompare = New CaseInsensitiveComparer
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim compareResult As Integer
Dim listviewX As ListViewItem
Dim listviewY As ListViewItem
' Cast the objects to be compared to ListViewItem objects.
listviewX = CType(x, ListViewItem)
listviewY = CType(y, ListViewItem)
' Compare the two items.
compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)
' Calculate the correct return value based on the object
' comparison.
If (OrderOfSort = SortOrder.Ascending) Then
' Ascending sort is selected, return typical result of
' compare operation.
Return compareResult
ElseIf (OrderOfSort = SortOrder.Descending) Then
' Descending sort is selected, return negative result of
' compare operation.
Return (-compareResult)
Else
' Return '0' to indicate that they are equal.
Return 0
End If
End Function
Public Property SortColumn() As Integer
Set(ByVal Value As Integer)
ColumnToSort = Value
End Set
Get
Return ColumnToSort
End Get
End Property
Public Property Order() As SortOrder
Set(ByVal Value As SortOrder)
OrderOfSort = Value
End Set
Get
Return OrderOfSort
End Get
End Property
End Class
Ho una variabile globale della Form:
codice:
Private lvwColumnSorter As ListViewColumnSorter
e nel click di un Button ho messo:
codice:
lvwColumnSorter = New ListViewColumnSorter
Me.ListView1.ListViewItemSorter = lvwColumnSorter
ListView4.Items.Clear()
For i As Integer = 0 To 20
ListView4.Items.Add("")
If CStr(i).Length = 1 Then
ListView4.Items(i).SubItems.Add("0" & i)
Else
ListView4.Items(i).SubItems.Add(i)
End If
Next
Al primo click la listview viene popolata e se clicco sulla colonna viene ordinata correttamente, ma se clicco una seconda volta sul bottone viene generato un errore:
codice:
InvalidArgument=Valore di '1' non valido per 'index'. Nome parametro: index
sulla riga della classe:
codice:
compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)