度々お世話になります。
リストビューに金額の項目を設け、それをソートすると期待通りに並びません。(エクスプローラのようになる)
例)
元 > 24, 315, 12, 210, 4
結果> 12, 210, 24, 315, 4
期待> 4, 12, 24, 210, 315
現在、これを実現しようとがんばっているところなんですが、もし簡単な方法があるのならば、知っておきたいと思い、ここに書き込ませていただきました。
よろしくお願いします。
ListViewは文字列でソートするため、そのような結果になります。
一番簡単なのは、"12", "315", "12", "210", "4"ではなく、
" 12", "315", " 12", "210", " 4"のように、先頭に空白を
入れてやる事です。これなら正しく並びかわります。
あるいは下記の様に、APIを使ってカスタムソートを行う事もできます。
http://support.microsoft.com/?kbid=170884
最近、ちょっと忙しかったので、返事が遅れてしまい、申し訳ございません。
お返事ありがとうございました。
上記の両方を試してみましたが、どちらも思ったよりもうまくいかなかったのと、別の方法を思いついたので、別のやり方で解決をしました。
以下に参考として、僕の行った方法でのソースを載せておきます。
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
ツイート | ![]() |