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)