listview 显示排序问题
With ListView1.ListItems
.Add Text:= "45 "
.Add Text:= "12 "
.Add Text:= "65 "
.Add Text:= "55 "
.Add Text:= "22 "
.Add Text:= "87 "
.Add Text:= "56 "
.Add Text:= "45 "
.Add Text:= "12 "
.Add Text:= "87 "
.Add Text:= "98 "
.Add Text:= "78 "
.Add Text:= "45 "
.Add Text:= "25 "
.Add Text:= "85 "
.Add Text:= "5 "
End With
如果LISTVIEW控件内的某一列是这些数字,有可能有小数,我想让他从上到下按照数字最小到最大排列,怎么写?
[解决办法]
'添加模块
====================================
Option Explicit
'Structures
Private Type POINT
x As Long
y As Long
End Type
Private Type LV_FINDINFO
flags As Long
psz As String
lParam As Long
pt As POINT
vkDirection As Long
End Type
Private Type LV_ITEM
mask As Long
iItem As Long
iSubItem As Long
State As Long
stateMask As Long
pszText As Long
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
'Constants
Private Const LVFI_PARAM = 1
Private Const LVIF_TEXT = &H1
Private Const LVM_FIRST = &H1000
Private Const LVM_FINDITEM = LVM_FIRST + 13
Private Const LVM_GETITEMTEXT = LVM_FIRST + 45
Private Const LVM_SORTITEMS = LVM_FIRST + 48
'API declarations
Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA " ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'回调函数
Public Function fLVCompareItem(ByVal lngParam1 As Long, ByVal lngParam2 As Long, ByVal hWnd As Long) As Long
Dim strName1 As String
Dim strName2 As String
Dim lret As Long
Dim sText1 As String
Dim sText2 As String
'Obtain the item names and dates corresponding to the
'input parameters
sText1 = ListView_GetItemData(lngParam1, hWnd, strName1)
sText2 = ListView_GetItemData(lngParam2, hWnd, strName2)
'Compare the dates
'Return 0 ==> Less Than
' 1 ==> Equal
' 2 ==> Greater Than 自定义比较方式、返回值
If len(sText1) < len(sText2) Then
lret = 0
ElseIf len(sText1)= len(sText2) Then
lret = 1
Else
lret = 2
End If
fLVCompareItem = lret
End Function
'GetItemData - Given Retrieves
Private Function ListView_GetItemData(lngParam As Long, hWnd As Long, strName As String)
Dim objFind As LV_FINDINFO
Dim lngIndex As Long
Dim objItem As LV_ITEM
Dim baBuffer(32) As Byte
Dim lngLength As Long
Dim sRet As String
'
' Convert the input parameter to an index in the list view
'
' objFind.flags = LVFI_PARAM
' objFind.lParam = lngParam
' lngIndex = SendMessage(hWnd, LVM_FINDITEM, -1, VarPtr(objFind))
'
' Obtain the name of the specified list view item
'
lngIndex = lngParam
objItem.mask = LVIF_TEXT
objItem.iSubItem = 0
objItem.pszText = VarPtr(baBuffer(0))
objItem.cchTextMax = UBound(baBuffer)
lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, VarPtr(objItem))
strName = Left$(StrConv(baBuffer, vbUnicode), lngLength)
'
' Obtain the modification date of the specified list view item
'
objItem.mask = LVIF_TEXT
objItem.iSubItem = 1
objItem.pszText = VarPtr(baBuffer(0))
objItem.cchTextMax = UBound(baBuffer)
lngLength = SendMessage(hWnd, LVM_GETITEMTEXT, lngIndex, VarPtr(objItem))
If lngLength > 0 Then
sRet = Left$(StrConv(baBuffer, vbUnicode), lngLength)
End If
ListView_GetItemData = sRet
End Function
'要排序的时候使用
========================================================================
SendMessage(Listview1.hWnd, LVM_SORTITEMSEX, Listview1.hWnd,AddressOf fLVCompareItem)
[解决办法]
Dim lngIndex As Long
'排序带数字的列
If ColumnHeader.TEXT = "岗次 " Then
For lngIndex = 1 To lvwEmployee.ListItems.Count
lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1) = Format(lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1), "000000000000 ")
Next
End If
With lvwEmployee
If (ColumnHeader.Index - 1) = .SortKey Then
.SortOrder = (.SortOrder + 1) Mod 2
Else
.Sorted = False
.SortOrder = 0
.SortKey = ColumnHeader.Index - 1
.Sorted = True
End If
End With
If ColumnHeader.TEXT = "岗次 " Then
For lngIndex = 1 To lvwEmployee.ListItems.Count
If lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1) = "000000000000 " Then
lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1) = "0 "
Else
lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1) = Format(lvwEmployee.ListItems(lngIndex).SubItems(ColumnHeader.Index - 1), "### ")
End If
Next
End If
修改下即可