Public Class clsListViewItemComparer
Implements IComparer
Private _Column As Integer
Private _Numeric As Boolean = False
Private _isDate As Boolean = False
Private _sortAscending As Boolean = False
Public Property Column() As Integer
Get
Return _Column
End Get
Set(ByVal Value As Integer)
_Column = Value
End Set
End Property
Public Property Numeric() As Boolean
Get
Return _Numeric
End Get
Set(ByVal Value As Boolean)
_Numeric = Value
End Set
End Property
Public Property isDate() As Boolean
Get
Return _isDate
End Get
Set(ByVal Value As Boolean)
_isDate = Value
End Set
End Property
Public Property sortAscending() As Boolean
Get
Return _sortAscending
End Get
Set(ByVal Value As Boolean)
_sortAscending = Value
End Set
End Property
Public Sub New(ByVal columnIndex As Integer)
Column = columnIndex
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim ListX As ListViewItem = CType(x, ListViewItem)
Dim ListY As ListViewItem = CType(y, ListViewItem)
If Numeric Then
' Convert column text to numbers before comparing.
' If the conversion fails, just use the value 0.
Dim ListXVal, ListYVal As Decimal
Try
ListXVal = Decimal.Parse(Replace(ListX.SubItems(Column).Text, "£", ""))
Catch
ListXVal = 0
End Try
Try
ListYVal = Decimal.Parse(Replace(ListY.SubItems(Column).Text, "£", ""))
Catch
ListYVal = 0
End Try
If Not sortAscending Then
Return Decimal.Compare(ListYVal, ListXVal)
Else
Return Decimal.Compare(ListXVal, ListYVal)
End If
ElseIf isDate Then
Dim ListXVal, ListYVal As Date
Try
ListXVal = Date.Parse(ListX.SubItems(Column).Text)
Catch
'ListXVal = 0
End Try
Try
ListYVal = Date.Parse(ListY.SubItems(Column).Text)
Catch
'ListYVal = 0
End Try
If Not sortAscending Then
Return Date.Compare(ListYVal, ListXVal)
Else
Return Date.Compare(ListXVal, ListYVal)
End If
Else
' Keep the column text in its native string format
' and perform an alphabetic comparison.
Dim ListXText As String = ListX.SubItems(Column).Text
Dim ListYText As String = ListY.SubItems(Column).Text
If Not sortAscending Then
Return String.Compare(ListYText, ListXText)
Else
Return String.Compare(ListXText, ListYText)
End If
End If
End Function
End Class