VB5.0: Sorting in a List View control

Hi, I have got a list view control in a form.  It has about 6 columns.  All coulmns contain either a "number" , a "date" (mmm dd yyyy), or a "string".  My problem is that when I click on a column to sort that column, it treats its contents as strings and sorts it accordingly.  For example, for a number coulmn, it puts all numbers starting with a 1 first, then the 2 etc.  For my dates column, instead of going from January to December, it sorts from April to September.  How can I force my list view control to treat each column differently and then sort accordingly.

A quick response would be greatly appreciated.

Thanks
jychAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

JuiletteCommented:

'CREATE SORTING OF LISTVIEW BY ALPHA, NUMBER, DATE
'
'PUT THIS IN GEN DECLARATIONS OF FORM
'*****************************************************************
'
Private Declare Function LockWindowUpdate Lib "user32" _
        (ByVal hWndLock As Long) As Long
'
Private Function InvNumber(ByVal Number As String) As String
    'This function is to deal with the negative numbers, so then they can be sorted alphabetically
'
    Static i As Integer
    For i = 1 To Len(Number)
        Select Case Mid$(Number, i, 1)
        Case "-": Mid$(Number, i, 1) = " "
        Case "0": Mid$(Number, i, 1) = "9"
        Case "1": Mid$(Number, i, 1) = "8"
        Case "2": Mid$(Number, i, 1) = "7"
        Case "3": Mid$(Number, i, 1) = "6"
        Case "4": Mid$(Number, i, 1) = "5"
        Case "5": Mid$(Number, i, 1) = "4"
        Case "6": Mid$(Number, i, 1) = "3"
        Case "7": Mid$(Number, i, 1) = "2"
        Case "8": Mid$(Number, i, 1) = "1"
        Case "9": Mid$(Number, i, 1) = "0"
        End Select
    Next
    InvNumber = Number
End Function
'
'LOAD THE LISTVIEW WITH RANDOM INFORMATION
'PUT THIS IN LOAD OR CLICK
'*********************************************************
'
Dim l As Long
    Dim dblRnd As Double
    Dim dteRnd As Date
    With ListView1
        ' Add three columns to the list - one for each data type.
        ' Note that the data type is set in the column header's
        ' tag in each case
'
        .ColumnHeaders.Add(, , "String").Tag = "STRING"
        .ColumnHeaders.Add(, , "Number").Tag = "NUMBER"
        .ColumnHeaders.Add(, , "Date").Tag = "DATE"
'
        ' Set the column alignment - has no bearing on the sorts.
'
        .ColumnHeaders(1).Alignment = lvwColumnLeft
        .ColumnHeaders(2).Alignment = lvwColumnRight
        .ColumnHeaders(3).Alignment = lvwColumnCenter
'
' Set BorderStyle property.
   ListView1.BorderStyle = ccFixedSingle
'
' Set View property to Report.
   ListView1.View = lvwReport
'
        ' Populate the list with data
        With .ListItems
            For l = 1 To 100
                With .Add(, , "ListItem " & Format(l, "0000"))
                    dblRnd = (Rnd() * 10000) - 5000
                    dteRnd = (Rnd() * 1000) + Date
                    .ListSubItems.Add , , Format(dblRnd, "0.00")
                    .ListSubItems.Add , , Format(dteRnd, _
                    "dd/mm/yyyy")
                End With
            Next l
        End With
    End With
'
'PUT THIS IN THE COLUMNCLICK EVENT OF LISTVIEW
'***********************************************
    Dim lngStart As Long
    Dim lngCursor As Long
    Dim l As Long
    Dim strFormat As String
    Dim strData() As String
    Dim lngIndex As Long
    On Error Resume Next
   
    With ListView1
        ' Display the hourglass cursor while list is sorting
        lngCursor = .MousePointer
        .MousePointer = vbHourglass
       
        ' Prevent the ListView control from updating on screen
        ' and also to speed up the sort
        LockWindowUpdate .hWnd
       
        ' Check the data type of the column being sorted,
        lngIndex = ColumnHeader.Index - 1
   
        Select Case UCase$(ColumnHeader.Tag)
            Case "DATE"
                ' Sort by date.
                strFormat = "YYYYMMDDHhNnSs"
                ' Loop through the values in this column. Re-format
                ' the dates so as they can be sorted alphabetically,
                With .ListItems
                    If (lngIndex > 0) Then
                        For l = 1 To .Count
                            With .Item(l).ListSubItems(lngIndex)
                                .Tag = .Text & Chr$(0) & .Tag
                                If IsDate(.Text) Then
                                    .Text = Format(CDate(.Text), _
                                    strFormat)
                                Else
                                    .Text = ""
                                End If
                            End With
                        Next l
                    Else
                        For l = 1 To .Count
                            With .Item(l)
                                .Tag = .Text & Chr$(0) & .Tag
                                If IsDate(.Text) Then
                                    .Text = Format(CDate(.Text), _
                                    strFormat)
                                Else
                                    .Text = ""
                                End If
                            End With
                        Next l
                    End If
                End With
                ' Sort the list alphabetically by this column
                .SortOrder = (.SortOrder + 1) Mod 2
                .SortKey = ColumnHeader.Index - 1
                .Sorted = True
               
                ' Restore the previous values to the 'cells' in this
                ' column of the list from the tags, and also restore
                ' the tags to their original values
                With .ListItems
                    If (lngIndex > 0) Then
                        For l = 1 To .Count
                            With .Item(l).ListSubItems(lngIndex)
                                strData = Split(.Tag, Chr$(0))
                                .Text = strData(0)
                                .Tag = strData(1)
                            End With
                        Next l
                    Else
                        For l = 1 To .Count
                            With .Item(l)
                                strData = Split(.Tag, Chr$(0))
                                .Text = strData(0)
                                .Tag = strData(1)
                            End With
                        Next l
                    End If
                End With
           
            Case "NUMBER"
                ' Sort Numerically
                strFormat = String(30, "0") & "." & String(30, "0")
                'Re-format the values so as they
                ' can be sorted alphabetically.
                With .ListItems
                    If (lngIndex > 0) Then
                        For l = 1 To .Count
                            With .Item(l).ListSubItems(lngIndex)
                                .Tag = .Text & Chr$(0) & .Tag
                                If IsNumeric(.Text) Then
                                    If CDbl(.Text) >= 0 Then
                                        .Text = Format(CDbl(.Text), _
                                        strFormat)
                                    Else
                                        .Text = "&" & InvNumber( _
                                        Format(0 - CDbl(.Text), _
                                        strFormat))
                                    End If
                                Else
                                    .Text = ""
                                End If
                            End With
                        Next l
                    Else
                        For l = 1 To .Count
                            With .Item(l)
                                .Tag = .Text & Chr$(0) & .Tag
                                If IsNumeric(.Text) Then
                                    If CDbl(.Text) >= 0 Then
                                        .Text = Format(CDbl(.Text), _
                                        strFormat)
                                    Else
                                        .Text = "&" & InvNumber( _
                                        Format(0 - CDbl(.Text), _
                                        strFormat))
                                    End If
                                Else
                                    .Text = ""
                                End If
                            End With
                        Next l
                    End If
                End With
                ' Sort the list alphabetically by this column
                .SortOrder = (.SortOrder + 1) Mod 2
                .SortKey = ColumnHeader.Index - 1
                .Sorted = True
           
                ' Restore the previous values to the 'cells' in this
                ' column of the list from the tags, and also restore
                ' the tags to their original values
                With .ListItems
                    If (lngIndex > 0) Then
                        For l = 1 To .Count
                            With .Item(l).ListSubItems(lngIndex)
                                strData = Split(.Tag, Chr$(0))
                                .Text = strData(0)
                                .Tag = strData(1)
                            End With
                        Next l
                    Else
                        For l = 1 To .Count
                            With .Item(l)
                                strData = Split(.Tag, Chr$(0))
                                .Text = strData(0)
                                .Tag = strData(1)
                            End With
                        Next l
                    End If
                End With
            Case Else
                'Just sort it alphabetically
                .SortOrder = (.SortOrder + 1) Mod 2
                .SortKey = ColumnHeader.Index - 1
                .Sorted = True
        End Select
        ' Unlock the list window so that the OCX can update it
        LockWindowUpdate 0&
        ' Restore the previous cursor
        .MousePointer = lngCursor
    End With
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
jychAuthor Commented:
Thanks a bunch
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.