Ich mag da eine generische Klasse benutzen (weil sichergestellt wird, dass die Items sortierbar sind, unter anderem).
Private col As Integer
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As _
System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
If col = e.Column Then
If ListView1.Sorting = SortOrder.Descending Then
ListView1.Sorting = SortOrder.Ascending
Else
ListView1.Sorting = SortOrder.Descending
End If
Else
ListView1.Sorting = SortOrder.Ascending
End If
col = e.Column
Select Case col
Case 0
ListView1.ListViewItemSorter = New lvsorter(Of String)(e.Column)
Case 1
ListView1.ListViewItemSorter = New lvsorter(Of Integer)( _
e.Column)
Case 2
ListView1.ListViewItemSorter = New lvsorter(Of Double)(e.Column)
Case 3
ListView1.ListViewItemSorter = New lvsorter(Of Integer)( _
e.Column)
End Select
End Sub
Private Class lvsorter(Of T As IComparable)
Implements IComparer
Private column As Integer
Private tc As System.ComponentModel.TypeConverter
Public Sub New(ByVal column As Integer)
Me.column = column
tc = System.ComponentModel.TypeDescriptor.GetConverter(GetType(T))
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As _
Integer Implements System.Collections.IComparer.Compare
Dim lvi1 As ListViewItem = CType(x, ListViewItem)
Dim lvi2 As ListViewItem = CType(y, ListViewItem)
Dim arg1 As T = tc.ConvertFromString(lvi1.SubItems(column).Text)
Dim arg2 As T = tc.ConvertFromString(lvi2.SubItems(column).Text)
If lvi1.ListView.Sorting = SortOrder.Ascending Then
Return arg1.CompareTo(arg2)
Else
Return -arg1.CompareTo(arg2)
End If
End Function
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
' Create columns for the items and subitems.
ListView1.Columns.Add("Item", -2, HorizontalAlignment.Left)
ListView1.Columns.Add("Col2", -2, HorizontalAlignment.Right)
ListView1.Columns.Add("Col3", -2, HorizontalAlignment.Right)
ListView1.Columns.Add("Col4", -2, HorizontalAlignment.Right)
' Create three items and three sets of subitems for each item.
Dim item1 As New ListViewItem("item3", 0)
item1.SubItems.Add("444")
item1.SubItems.Add("2.4")
item1.SubItems.Add("10")
Dim item2 As New ListViewItem("item7", 1)
item2.SubItems.Add("9")
item2.SubItems.Add("9.99")
item2.SubItems.Add("100")
Dim item3 As New ListViewItem("item1", 0)
item3.SubItems.Add("103")
item3.SubItems.Add("9.91")
item3.SubItems.Add("3")
'Add the items to the ListView.
ListView1.Items.AddRange(New ListViewItem() {item1, item2, item3})
End Sub Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov |