Torna al Thread
Public Class TuaForm
Private sorter As CustomListViewSorter
Private Sub tuaListView_ColumnClick(ByVal sender As Object, ByVal e As ColumnClickEventArgs) Handles tuaListView.ColumnClick
'Se la colonna clickata era già quella di ordinamento, inverte l'ordine
If e.Column = sorter.ColumnIndex Then
If sorter.SortOrder = SortOrder.Ascending Then
sorter.SortOrder = SortOrder.Descending
Else
sorter.SortOrder = SortOrder.Ascending
End If
Else
'Altrimenti imposta la colonna con cui eseguire il sorting
sorter.SortOrder = SortOrder.Ascending
sorter.ColumnIndex = e.Column
End If
'In base al tipo di colonna imposta il tipo di ordinamento
Select Case e.Column
Case 0
sorter.TypeOfData = CustomListViewSorter.ObjectType.StringNoCase
Case 1
sorter.TypeOfData = CustomListViewSorter.ObjectType.Numeric
Case 2
sorter.TypeOfData = CustomListViewSorter.ObjectType.DateTime
End Select
'Esegue l'ordinamento
tuaListView.Sort()
End Sub
Private Sub TuaForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
sorter = New CustomListViewSorter()
tuaListView.ListViewItemSorter = sorter
End Sub
End Class
Class CustomListViewSorter
Implements IComparer
Private type As ObjectType
Private order As SortOrder
Private column As Integer
Public Sub New()
'Inizializza i valori di default
Me.type = ObjectType.Unknown
Me.column = 0
Me.order = SortOrder.None
End Sub
Public Enum ObjectType
Unknown = 0
StringCase
StringNoCase
Numeric
DateTime
End Enum
Public Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare
If Me.order = SortOrder.None Then
Return 0
End If
'Il risultato della comparazione
Dim compRes As Integer
'Ottiene i due elementi da comparare
Dim itemA As ListViewItem = CType(a, ListViewItem)
Dim itemB As ListViewItem = CType(b, ListViewItem)
'Ottiene i valori dei due oggetti
Dim strA As String = itemA.SubItems(Me.column).Text
Dim strB As String = itemB.SubItems(Me.column).Text
'Compara gli oggetti in base al tipo specificato
Select Case type
Case ObjectType.StringCase
'Stringhe, case sensitive
compRes = String.Compare(strA, strB, False)
Case ObjectType.StringNoCase
'Stringhe, non case sensitive
compRes = String.Compare(strA, strB, True)
Case ObjectType.Numeric
'Valori numerici
Dim valA As Double = Double.Parse(strA)
Dim valB As Double = Double.Parse(strB)
compRes = CType(valA - valB, Integer)
Case ObjectType.DateTime
'Data
Dim valA As DateTime = DateTime.Parse(strA)
Dim valB As DateTime = DateTime.Parse(strB)
compRes = DateTime.Compare(valA, valB)
Case Else
'Non riconosciuto
Return 0
End Select
'Se è in ordine ascendente, ritorna il valore stesso
If order = SortOrder.Ascending Then
Return compRes
Else
'Altrimenti inverte il risultato (facendo il negativo)
Return -compRes
End If
End Function
Public Property ColumnIndex() As Integer
Get
Return Me.column
End Get
Set(ByVal value As Integer)
Me.column = value
End Set
End Property
Public Property SortOrder() As SortOrder
Get
Return Me.order
End Get
Set(ByVal value As SortOrder)
Me.order = value
End Set
End Property
Public Property TypeOfData() As ObjectType
Get
Return Me.type
End Get
Set(ByVal value As ObjectType)
Me.type = value
End Set
End Property
End Class