Results 1 to 3 of 3

Thread: List view --> Sort

  1. #1
    Guest

    Question

    How can I sort list view according to integer or date format and not according to string ?

  2. #2
    transcendental analytic kedaman's Avatar
    Join Date
    Mar 2000
    Location
    0x002F2EA8
    Posts
    7,221
    I suppose you know the idea of any sorting method, it does a comparation and then swaps if they are missplaced. In what order and which ones depends on the sorting method.

    When you compare two strings you use > or < operator, you can do the same for integers, but for dates you need use datediff function, and check if the result is smaller than 0.
    If Datediff("d",Date1,Date2)<0 then 'do the swap.

    you could replace the "d" with a "s" if you work with datetimes.
    Use
    writing software in C++ is like driving rivets into steel beam with a toothpick.
    writing haskell makes your life easier:
    reverse (p (6*9)) where p x|x==0=""|True=chr (48+z): p y where (y,z)=divMod x 13
    To throw away OOP for low level languages is myopia, to keep OOP is hyperopia. To throw away OOP for a high level language is insight.

  3. #3
    _______ 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

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