Results 1 to 5 of 5

Thread: Sorting on DATE columns in MS List View

  1. #1

    Thread Starter
    Fanatic Member simonm's Avatar
    Join Date
    Sep 2000
    Location
    Devon, England
    Posts
    796

    Angry

    Does anybody know how to get this to work?

    The listview seems only capable of accepting strings as it's items so dates have to be converted to text and therefore are sorted as text.

    How can I get around this?

  2. #2
    PowerPoster Chris's Avatar
    Join Date
    Jan 1999
    Location
    K-PAX
    Posts
    3,238

    Thumbs up ColumnClick Events

    hope this can help you...

    Code:
    Private Sub listview_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    listview.SortKey = ColumnHeader.Index - 1
    If listview.SortOrder = lvwAscending Then
        listview.SortOrder = lvwDescending
    Else
        listview.SortOrder = lvwAscending
    End If
    listview.Sorted = True
    End Sub

  3. #3

    Thread Starter
    Fanatic Member simonm's Avatar
    Join Date
    Sep 2000
    Location
    Devon, England
    Posts
    796

    Thumbs down Well,

    Not really. If the column contains a date, it is sorted as a string (and therefore not in date order).

    I know how to sort columns generally but dates (and number columns for that matter) are a problem.

    Thanks anyway,

    Simon.

  4. #4
    _______ HeSaidJoe's Avatar
    Join Date
    Jun 1999
    Location
    Canada
    Posts
    3,946

    <?>

    Code:
    '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
    "A myth is not the succession of individual images,
    but an integerated meaningful entity,
    reflecting a distinct aspect of the real world."

    ___ Adolf Jensen

  5. #5
    Guest
    An easier way to sort is to add the date in yyyymmdd format into the tag property of the listitem, and use that to sort on.

    - gaffa

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width