Option Strict Off
Public Class clsLvSort

    Implements System.Collections.IComparer

    Private _ColumnIndex As Integer
    Private _AscendingSort As Boolean
    Private _DataType As SourceDataType = SourceDataType.Text

#Region " Overloaded Public Sub New "
    Public Sub New(ByVal ColumnIndex As Integer, ByVal AscendingSort As Boolean)
        _ColumnIndex = ColumnIndex
        _AscendingSort = AscendingSort
    End Sub

    Public Sub New(ByVal ColumnIndex As Integer, ByVal AscendingSort As Boolean, ByVal DataType As SourceDataType)
        _ColumnIndex = ColumnIndex
        _AscendingSort = AscendingSort
        _DataType = DataType
    End Sub
#End Region

    Public Function Compare(ByVal Object1 As Object, ByVal Object2 As Object) As Integer Implements System.Collections.IComparer.Compare

        Dim ListViewItem1 As ListViewItem = CType(Object1, ListViewItem)
        Dim ListViewItem2 As ListViewItem = CType(Object2, ListViewItem)

        If _AscendingSort = True Then                                               'Checks to see if it should sort in Ascending order
            If _DataType = SourceDataType.Text Then                                 'Checks to see if it should sort the items as text
                If ListViewItem1.SubItems(_ColumnIndex).Text = "" Then Return -1
                Return String.Compare(ListViewItem1.SubItems(_ColumnIndex).Text, ListViewItem2.SubItems(_ColumnIndex).Text)
            ElseIf _DataType = SourceDataType.Date_Time Then
                Return Date.Compare(Date.Parse(ListViewItem1.SubItems(_ColumnIndex).Text), Date.Parse(ListViewItem2.SubItems(_ColumnIndex).Text))
                'Return Date.Compare(ListViewItem1.SubItems(_ColumnIndex).Text, ListViewItem2.SubItems(_ColumnIndex).Text)
            Else                                                                    'It should sort the items as Integers
                If ListViewItem1.SubItems(_ColumnIndex).Text = "" Then Return -1
                Return Double.Parse(ListViewItem1.SubItems(_ColumnIndex).Text) - Double.Parse(ListViewItem2.SubItems(_ColumnIndex).Text)
            End If
        Else
            If _DataType = SourceDataType.Text Then                                 'Checks to see if it should sort the items as text
                Return String.Compare(ListViewItem2.SubItems(_ColumnIndex).Text, ListViewItem1.SubItems(_ColumnIndex).Text)
            ElseIf _DataType = SourceDataType.Date_Time Then
                Return Date.Compare(Date.Parse(ListViewItem2.SubItems(_ColumnIndex).Text), Date.Parse(ListViewItem1.SubItems(_ColumnIndex).Text))
                'Return Date.Compare(ListViewItem2.SubItems(_ColumnIndex).Text, ListViewItem1.SubItems(_ColumnIndex).Text)
            Else                                                                    'It should sort the items as Integers
                Return Double.Parse(ListViewItem2.SubItems(_ColumnIndex).Text) - Double.Parse(ListViewItem1.SubItems(_ColumnIndex).Text)
            End If
        End If

    End Function
    Public Enum SourceDataType

        Text
        Numerical
        Date_Time

    End Enum

End Class
