每列可以排序,例如显示文字的列,显示金额的列(如何正确进行索引?)

解决方案 »

  1.   

    日期你得 在填充ListView时加一个判断,If VarType(tail) = vbDate Then
        lvwVar.ListItems.Add , , Format(tail, "yyyy-mm-dd hh:mm:ss")
     Else
         lvwVar.ListItems.Add , , tail
     End If
      

  2.   

    那你意思,所有的数字段都用Format构造出字符串,然后再用Listview本身的排序sort,这样行吗?
      

  3.   

    金额可以当作数字,用个数组自己做排序,然后逐个加入
    不然就是如下情况
    1
    11
    12
    2
    10日期的那个format成为 yyyymmdd就好了
      

  4.   

    Option Explicit'****************************************************************
    ' Win32 API
    '----------------------------------------------------------------Private Declare Function LockWindowUpdate Lib "user32" _
            (ByVal hWndLock As Long) As LongPrivate Declare Function GetTickCount Lib "kernel32" () As Long'****************************************************************
    ' Form_Load
    ' Initialises the list control, and populates it with random data
    '----------------------------------------------------------------Private Sub Form_Load()
        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
            
            ' Populate the list with data
            
            Dim l As Long
            Dim dblRnd As Double
            Dim dteRnd As Date
            With .ListItems
                For l = 1 To 1000
                    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
    End Sub
      

  5.   

    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As _
                                        MSComctlLib.ColumnHeader)    On Error Resume Next
        
        ' Record the starting CPU time (milliseconds since boot-up)
        
        Dim lngStart As Long
        lngStart = GetTickCount
        
        ' Commence sorting
        
        With ListView1
        
            ' Display the hourglass cursor whilst sorting
            
            Dim lngCursor As Long
            lngCursor = .MousePointer
            .MousePointer = vbHourglass
            
            ' Prevent the ListView control from updating on screen -
            ' this is to hide the changes being made to the listitems
            ' and also to speed up the sort
            
            LockWindowUpdate .hWnd
            
            ' Check the data type of the column being sorted,
            ' and act accordingly
            
            Dim l As Long
            Dim strFormat As String
            Dim strData() As String
            
            Dim lngIndex As Long
            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,
                ' having already stored their visible values in the
                ' tag, along with the tag's original value
            
                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")
            
                ' Loop through the values in this column. Re-format the values so as they
                ' can be sorted alphabetically, having already stored their visible
                ' values in the tag, along with the tag's original value
            
                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
            
      

  6.   

    Case Else   ' Assume sort by string
                
                ' Sort alphabetically. This is the only sort provided
                ' by the MS ListView control (at this time), and as
                ' such we don't really need to do much here
            
                .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
        
        ' Report time elapsed, in milliseconds
        
        MsgBox "Time Elapsed = " & GetTickCount - lngStart & "ms"
        
    End Sub'****************************************************************
    ' InvNumber
    ' Function used to enable negative numbers to be sorted
    ' alphabetically by switching the characters
    '----------------------------------------------------------------Private Function InvNumber(ByVal Number As String) As String
        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'****************************************************************
    '
    '----------------------------------------------------------------
      

  7.   

    给你个联接算了
    http://www.codeguru.com/vb/controls/vb_listview/article.php/c1669/
    对数字/字符/日期排序。