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
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5