应该不难吧。 根据指定列排序状况,修改Text Private Sub Form_Load() ListView1.View = lvwReport ListView1.AllowColumnReorder = True ListView1.ColumnHeaders.Add , , "第1列(↑)" End Sub Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) If ColumnHeader.Text Like "*↑*" Then ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↑", "↓") Else ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↓", "↑") End If End Sub
小三角形是一个ICO的图片Private Const LVM_FIRST = &H1000 Private Const LVM_GETHEADER = (LVM_FIRST + 31)Private Const HDI_BITMAP = &H10 Private Const HDI_IMAGE = &H20 Private Const HDI_FORMAT = &H4 Private Const HDI_TEXT = &H2Private Const HDF_BITMAP_ON_RIGHT = &H1000 Private Const HDF_BITMAP = &H2000 Private Const HDF_IMAGE = &H800 Private Const HDF_STRING = &H4000Private Const HDM_FIRST = &H1200 Private Const HDM_SETITEM = (HDM_FIRST + 4) Private Const HDM_SETIMAGELIST = (HDM_FIRST + 8) Private Const HDM_GETIMAGELIST = (HDM_FIRST + 9)Private Type HD_ITEM mask As Long cxy As Long pszText As String hbm As Long cchTextMax As Long fmt As Long lParam As Long iImage As Long iOrder As Long End TypePrivate Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long Private Sub Form_Load() Dim i As Integer Dim itmX As ListItem
'Create and populate the listview With ListView1
.SmallIcons = ImageList1
For i = 1 To 3 .ColumnHeaders.Add , "x" & i, "Column " & i .ColumnHeaders.Item(i).Width = 1520 Next i
For i = 1 To 9 Set itmX = .ListItems.Add(, "key" & i, "Item " & i) itmX.SubItems(1) = "Subitem " & i itmX.SubItems(2) = "Subitem " & i Next i
End Sub Public Sub ShowHeaderIcon(colNo As Long, _ imgIconNo As Long, _ showImage As Long) Dim hHeader As Long Dim HD As HD_ITEM
'get a handle to the listview header component hHeader = SendMessage(ListView1.hwnd, LVM_GETHEADER, 0, ByVal 0)
'set up the required structure members With HD .mask = HDI_IMAGE Or HDI_FORMAT .pszText = ListView1.ColumnHeaders(colNo + 1).Text
If showImage Then .fmt = HDF_STRING Or HDF_IMAGE Or HDF_BITMAP_ON_RIGHT .iImage = imgIconNo Else .fmt = HDF_STRING End If End With
'modify the header Call SendMessage(hHeader, HDM_SETITEM, colNo, HD)
End Sub Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader) Dim i As Long Static sOrder
sOrder = Not sOrder
'Use default sorting to sort the items in the list ListView1.SortKey = ColumnHeader.Index - 1 ListView1.SortOrder = Abs(sOrder) ListView1.Sorted = True
'clear the image from the headers not 'currently selected, and update the 'header clicked For i = 0 To 2
'if this is the index of the header clicked If i = ListView1.SortKey Then
排序用这代码最简单了 Private Sub LVTest_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) LVTest.Sorted = True LVTest.SortKey = ColumnHeader.Index - 1 Dim i As Integer For i = 1 To LVTest.ColumnHeaders.Count If InStr(1, LVTest.ColumnHeaders(i).Text, "▲", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3) If InStr(1, LVTest.ColumnHeaders(i).Text, "▼", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3) Next i If LVTest.SortOrder = lvwAscending Then ColumnHeader.Text = ColumnHeader.Text & " ▼" LVTest.SortOrder = lvwDescending Else ColumnHeader.Text = ColumnHeader.Text & " ▲" LVTest.SortOrder = lvwAscending End If
这里面有详尽的写法,具体在cLVHeaderSortIcons.cls的SetHeaderIcons函数中,楼主可参考一下
根据指定列排序状况,修改Text
Private Sub Form_Load()
ListView1.View = lvwReport
ListView1.AllowColumnReorder = True
ListView1.ColumnHeaders.Add , , "第1列(↑)"
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
If ColumnHeader.Text Like "*↑*" Then
ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↑", "↓")
Else
ColumnHeader.Text = VBA.Replace(ColumnHeader.Text, "↓", "↑")
End If
End Sub
返回或者设置 Imagelist 控件,该控件为 ColumnHeaders 集合提供图标。语法object.ColumnHeaderIcons [= imagelist]ColumnHeaderIcons 的语法包括下列部分:部分 描述
object 一个对象表达式,其值等于“应用于”列表中的一个对象。
imagelist 一个 ImageList 控件,或者指向 Imagelist 控件的一个对象引用。
说明要为 ColumnHeader 对象设置图标,请将它的 Icon 属性设置成为一个索引值、关键字或者对象引用,以指向 ColumnHeaderIcons 属性指定的 ImageList 控件中的一个 ListImage 对象。
Private Const LVM_GETHEADER = (LVM_FIRST + 31)Private Const HDI_BITMAP = &H10
Private Const HDI_IMAGE = &H20
Private Const HDI_FORMAT = &H4
Private Const HDI_TEXT = &H2Private Const HDF_BITMAP_ON_RIGHT = &H1000
Private Const HDF_BITMAP = &H2000
Private Const HDF_IMAGE = &H800
Private Const HDF_STRING = &H4000Private Const HDM_FIRST = &H1200
Private Const HDM_SETITEM = (HDM_FIRST + 4)
Private Const HDM_SETIMAGELIST = (HDM_FIRST + 8)
Private Const HDM_GETIMAGELIST = (HDM_FIRST + 9)Private Type HD_ITEM
mask As Long
cxy As Long
pszText As String
hbm As Long
cchTextMax As Long
fmt As Long
lParam As Long
iImage As Long
iOrder As Long
End TypePrivate Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Sub Form_Load() Dim i As Integer
Dim itmX As ListItem
'Create and populate the listview
With ListView1
.SmallIcons = ImageList1
For i = 1 To 3
.ColumnHeaders.Add , "x" & i, "Column " & i
.ColumnHeaders.Item(i).Width = 1520
Next i
For i = 1 To 9
Set itmX = .ListItems.Add(, "key" & i, "Item " & i)
itmX.SubItems(1) = "Subitem " & i
itmX.SubItems(2) = "Subitem " & i
Next i
End With
'ShowHeaderIcon colNo, imgIndex, showFlag
ShowHeaderIcon 0, 0, True
End Sub
Private Sub Command1_Click() Unload Me
End Sub
Public Sub ShowHeaderIcon(colNo As Long, _
imgIconNo As Long, _
showImage As Long) Dim hHeader As Long
Dim HD As HD_ITEM
'get a handle to the listview header component
hHeader = SendMessage(ListView1.hwnd, LVM_GETHEADER, 0, ByVal 0)
'set up the required structure members
With HD
.mask = HDI_IMAGE Or HDI_FORMAT
.pszText = ListView1.ColumnHeaders(colNo + 1).Text
If showImage Then
.fmt = HDF_STRING Or HDF_IMAGE Or HDF_BITMAP_ON_RIGHT
.iImage = imgIconNo
Else
.fmt = HDF_STRING
End If
End With
'modify the header
Call SendMessage(hHeader, HDM_SETITEM, colNo, HD)
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader) Dim i As Long
Static sOrder
sOrder = Not sOrder
'Use default sorting to sort the items in the list
ListView1.SortKey = ColumnHeader.Index - 1
ListView1.SortOrder = Abs(sOrder)
ListView1.Sorted = True
'clear the image from the headers not
'currently selected, and update the
'header clicked
For i = 0 To 2
'if this is the index of the header clicked
If i = ListView1.SortKey Then
'ShowHeaderIcon colNo, imgIndex, showFlag
ShowHeaderIcon ListView1.SortKey, _
ListView1.SortOrder, _
True
Else
ShowHeaderIcon i, 0, False
End If
Next
End Sub
Private Sub LVTest_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) LVTest.Sorted = True
LVTest.SortKey = ColumnHeader.Index - 1
Dim i As Integer
For i = 1 To LVTest.ColumnHeaders.Count
If InStr(1, LVTest.ColumnHeaders(i).Text, "▲", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3) If InStr(1, LVTest.ColumnHeaders(i).Text, "▼", vbTextCompare) <> 0 Then LVTest.ColumnHeaders(i).Text = Left(LVTest.ColumnHeaders(i).Text, Len(LVTest.ColumnHeaders(i).Text) - 3) Next i
If LVTest.SortOrder = lvwAscending Then
ColumnHeader.Text = ColumnHeader.Text & " ▼"
LVTest.SortOrder = lvwDescending
Else
ColumnHeader.Text = ColumnHeader.Text & " ▲"
LVTest.SortOrder = lvwAscending
End If
End Sub