Torna al Thread
'CLASSE ICOMPARER PERSONALIZZATA CHE ORDINA IN STILE WINDOWS EXPLORER
Public Class CustomComparer
Implements IComparer
Private Position As Integer
Private Order As Integer = 1
Private NomeColonna As String = ""
Public Sub New(_NomeColonna As String, Optional ByVal Ascending As Boolean = True)
NomeColonna = _NomeColonna
If Not Ascending Then
Order = -1
End If
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim ValoreX As String = CType(x, DatiItemLView_Dati).NomeFile
Dim ValoreY As String = CType(y, DatiItemLView_Dati).NomeFile
Dim res1() As String = System.Text.RegularExpressions.Regex.Split(ValoreX.ToString, "(\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Dim reswithempty() As String = System.Text.RegularExpressions.Regex.Split(ValoreY.ToString, "(\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Dim res2(0) As String
Dim c As Integer = 0
For Each item In reswithempty ' I dont like this
If item <> String.Empty Then
ReDim Preserve res2(c)
res2(c) = item
c += 1
End If
Next
Position = 0
For Each xstr In res1
If res2.Length > Position Then
If xstr <> String.Empty Then
If Not IsNumeric(xstr) AndAlso Not IsNumeric(res2(Position)) Then
Dim intresult As Integer = String.Compare(xstr, res2(Position), True)
If intresult <> 0 Then
Return intresult * Order
Else
Position += 1
End If
ElseIf IsNumeric(xstr) And Not IsNumeric(res2(Position)) Then
Return -1 * Order
ElseIf Not IsNumeric(xstr) And IsNumeric(res2(Position)) Then
Return 1 * Order
ElseIf IsNumeric(xstr) And IsNumeric(res2(Position)) Then
Dim res As Integer = Decimal.Compare(Decimal.Parse(xstr), Decimal.Parse(res2(Position)))
If res = 0 Then
Position += 1
Else
Return res * Order
End If
End If
End If
Else
Return -1 * Order
End If
Next
Return 1 * Order
End Function
End Class
'HANDLE SULL'EVENTO SORTING PER ESEGUIRE IL SORTING PERSONALIZZATO
Private Sub DataGrid1_Sorting(sender As Object, e As Microsoft.Windows.Controls.DataGridSortingEventArgs) Handles DataGrid1.Sorting
Dim column As Microsoft.Windows.Controls.DataGridColumn = e.Column
Dim comparer As IComparer = Nothing
e.Handled = True
Dim direction As ListSortDirection = If((column.SortDirection <> ListSortDirection.Ascending), ListSortDirection.Ascending, ListSortDirection.Descending)
column.SortDirection = direction
Dim lcv As ListCollectionView = DirectCast(CollectionViewSource.GetDefaultView(DataGrid1.ItemsSource), ListCollectionView)
comparer = New CustomComparer(column.SortMemberPath, IIf(direction = ListSortDirection.Ascending, True, False))
lcv.CustomSort = comparer
End Sub