リストビューでの数字のソート

解決


TAKE  2003-06-28 10:35:14  No: 78470

度々お世話になります。

リストビューに金額の項目を設け、それをソートすると期待通りに並びません。(エクスプローラのようになる)

例)

元  >  24, 315, 12, 210, 4
結果>  12, 210, 24, 315, 4

期待>  4, 12, 24, 210, 315

現在、これを実現しようとがんばっているところなんですが、もし簡単な方法があるのならば、知っておきたいと思い、ここに書き込ませていただきました。

よろしくお願いします。


魔界の仮面弁士  2003-06-28 11:36:07  No: 78471

ListViewは文字列でソートするため、そのような結果になります。

一番簡単なのは、"12", "315", "12", "210", "4"ではなく、
" 12", "315", " 12", "210", "  4"のように、先頭に空白を
入れてやる事です。これなら正しく並びかわります。

あるいは下記の様に、APIを使ってカスタムソートを行う事もできます。
http://support.microsoft.com/?kbid=170884


TAKE  2003-07-08 11:48:19  No: 78472

最近、ちょっと忙しかったので、返事が遅れてしまい、申し訳ございません。

お返事ありがとうございました。

上記の両方を試してみましたが、どちらも思ったよりもうまくいかなかったのと、別の方法を思いついたので、別のやり方で解決をしました。

以下に参考として、僕の行った方法でのソースを載せておきます。

Private Sub lvwList_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    
    If ColumnHeader.Index = 1 Then
        lvwList.Sorted = True
        sortList (ColumnHeader.Index)
    Else
        lvwList.Sorted = False
        sortNumList
    End If
    
End Sub

Private Sub sortNumList()

    Dim i As Integer                'index
    Dim j As Integer                'index
    Dim li As ListItem              'list item
    Dim intMin As Double            'minimum value
    Dim intMax As Double            'maximum value
    Dim intRemovedRow As Integer    'row number to be removed
    Dim intCount As Integer         'the number of row listed

    intCount = lvwList.ListItems.Count

    If isAsc = False Then
    
        For i = 1 To lvwList.ListItems.Count
        
            'Set dammy minimum value
            intMin = 100000
            
            For j = 1 To intCount
            
                'Check if the item is minimum
                If lvwList.ListItems(j).SubItems(1) < intMin Then
                    intMin = lvwList.ListItems(j).SubItems(1)
                    intRemovedRow = j
                End If
                
            Next
            
            isAsc = True
        
            'Add new list item
            Set li = lvwList.ListItems.Add(, , lvwList.ListItems(intRemovedRow))
                li.SubItems(1) = lvwList.ListItems(intRemovedRow).SubItems(1)
            
            'Remove old list item
            lvwList.ListItems.Remove (intRemovedRow)
            
            intCount = intCount - 1
            
        Next
        
    Else
    
        For i = 1 To lvwList.ListItems.Count
        
            'Set dammy maximum value
            intMax = 0
            
            For j = 1 To intCount
            
                'Check if the item is minimum
                If lvwList.ListItems(j).SubItems(1) > intMax Then
                    intMax = lvwList.ListItems(j).SubItems(1)
                    intRemovedRow = j
                End If
                
            Next
            
            isAsc = False
    
        
            'Add new list item
            Set li = lvwList.ListItems.Add(, , lvwList.ListItems(intRemovedRow))
                li.SubItems(1) = lvwList.ListItems(intRemovedRow).SubItems(1)
            
            
            'Remove old list item
            lvwList.ListItems.Remove (intRemovedRow)
            
            intCount = intCount - 1
            
        Next
    
    End If

End Sub

Private Sub sortList(ColumnHeaderIndex As Integer)

    If lvwList.SortKey = ColumnHeaderIndex - 1 Then
        If lvwList.SortOrder = lvwAscending Then
            lvwList.SortOrder = lvwDescending
        Else
            lvwList.SortOrder = lvwAscending
        End If
    Else
        lvwList.SortKey = ColumnHeaderIndex - 1
        lvwList.SortOrder = lvwAscending
    End If

End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加