Sorting Listview columns in the .NET world is not simple. Let me see if I can give you the tools that I use for the same task. First, add this class to your project.
Imports System.Windows.Forms
Public Class C_ListviewComparer
Implements IComparer
#Region " Members "
Private _columnNumber As Integer
Private _sortOrder As SortOrder
#End Region
#Region " Constructors "
Public Sub New(ByVal ColumnNumber As Integer, _
Optional ByVal SortOrder As SortOrder = SortOrder.Ascending)
_columnNumber = ColumnNumber
_sortOrder = SortOrder
End Sub
#End Region
#Region " Methods "
#Region " ... Compare "
Public Function Compare( _
ByVal Lvi1 As Object, _
ByVal Lvi2 As Object) As Integer _
Implements System.Collections.IComparer.Compare
'-----------------------------------------------------
' Compare two subitem values in the same listview
' column
'-----------------------------------------------------
Select Case _sortOrder
Case SortOrder.Ascending ' Ascending sort order
Return CompareResult(SubitemValue(DirectCast(Lvi1, ListViewItem)), _
SubitemValue(DirectCast(Lvi2, ListViewItem)))
Case Else ' Descending sort order
Return CompareResult(SubitemValue(DirectCast(Lvi2, ListViewItem)), _
SubitemValue(DirectCast(Lvi1, ListViewItem)))
End Select
End Function
#End Region
#End Region
#Region " Procedures "
#Region " ... CompareResult "
Private Function CompareResult( _
ByVal FirstString As String, _
ByVal SecondString As String) As Integer
'-----------------------------------------------------
' Compare the subitem values to determine their sort
' order. For ascending sorts, the FirstString is the X
' value and SecondString the Y value. The values are
' reversed for a Descending sort.
'-----------------------------------------------------
If IsNumeric(FirstString) _
AndAlso IsNumeric(SecondString) Then
'** Numeric values
Return Val(FirstString).CompareTo(Val(SecondString))
ElseIf IsDate(FirstString) _
AndAlso IsDate(SecondString) Then
'** Date values