Public Class clsListViewItemComparer
Implements IComparer
Private _Column As Integer
Private _isInteger As Boolean = False
Private _isDecimal As Boolean = False
Private _isDate As Boolean = False
Private _isIPAddress As Boolean = False
Private _sortOrder As SortOrder = Windows.Forms.SortOrder.None
Public Property Column() As Integer
Get
Return _Column
End Get
Set(ByVal Value As Integer)
_Column = Value
End Set
End Property
Public Property isInteger() As Boolean
Get
Return _isInteger
End Get
Set(ByVal Value As Boolean)
_isInteger = Value
End Set
End Property
Public Property isDecimal() As Boolean
Get
Return _isDecimal
End Get
Set(ByVal Value As Boolean)
_isDecimal = 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 isIPAddress() As Boolean
Get
Return _isIPAddress
End Get
Set(ByVal Value As Boolean)
_isIPAddress = Value
End Set
End Property
Public Property sortOrder() As SortOrder
Get
Return _sortOrder
End Get
Set(ByVal Value As SortOrder)
_sortOrder = 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 isInteger Then
' Convert column text to numbers before comparing.
' If the conversion fails, just use the value 0.
Dim ListXVal, ListYVal As Integer
Try
ListXVal = Integer.Parse(ListX.SubItems(Column).Text)
Catch
ListXVal = 0
End Try
Try
ListYVal = Integer.Parse(ListY.SubItems(Column).Text)
Catch
ListYVal = 0
End Try
If Not sortOrder = Windows.Forms.SortOrder.Ascending Then
Return ListYVal.CompareTo(ListXVal)
Else
Return ListXVal.CompareTo(ListYVal)
End If
ElseIf isDecimal 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(ListX.SubItems(Column).Text)
Catch
ListXVal = 0
End Try
Try
ListYVal = Decimal.Parse(ListY.SubItems(Column).Text)
Catch
ListYVal = 0
End Try
If Not sortOrder = Windows.Forms.SortOrder.Ascending 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 sortOrder = Windows.Forms.SortOrder.Ascending Then
Return Date.Compare(ListYVal, ListXVal)
Else
Return Date.Compare(ListXVal, ListYVal)
End If
ElseIf isIPAddress Then
Dim ListXVal, ListYVal As Integer
Dim splitIndex As Integer = 0
nextElement:
Try
ListXVal = Integer.Parse(ListX.SubItems(Column).Text.Split("."c)(splitIndex))
Catch
ListXVal = 0
End Try
Try
ListYVal = Integer.Parse(ListY.SubItems(Column).Text.Split("."c)(splitIndex))
Catch
ListYVal = 0
End Try
If Not sortOrder = Windows.Forms.SortOrder.Ascending Then
If ListYVal.CompareTo(ListXVal) = 0 Then
If splitIndex < 3 Then
splitIndex += 1
GoTo nextElement
Else
Return 0
End If
Else
Return ListYVal.CompareTo(ListXVal)
End If
Else
If ListXVal.CompareTo(ListYVal) = 0 Then
If splitIndex < 3 Then
splitIndex += 1
GoTo nextElement
Else
Return 0
End If
Else
Return ListXVal.CompareTo(ListYVal)
End If
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 sortOrder = Windows.Forms.SortOrder.Ascending Then
Return String.Compare(ListYText, ListXText)
Else
Return String.Compare(ListXText, ListYText)
End If
End If
End Function
End Class