ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4079|回复: 9

[求助] 怎么实现listview的排序(已经解决)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-27 11:51 | 显示全部楼层 |阅读模式
就是一个listview,我点击它的一列,就自动的像excel表中的那样,自动就排除一个序出来呢?
怎么写这个代码呢?这个应该是listview的什么事件呢?

[ 本帖最后由 kiko2006 于 2010-5-28 09:09 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-5-27 13:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提个实际的需求出来,并上传你的附件

TA的精华主题

TA的得分主题

发表于 2010-5-27 17:15 | 显示全部楼层

应该是一个ListView1_ColumnClick事件

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
.SortKey = ColumnHeader.Index - 1
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else: .SortOrder = lvwAscending
.Sorted = True
End If
End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-28 09:09 | 显示全部楼层
谢谢楼上的小新,谢谢,就是这个,Thanks!!!!!

TA的精华主题

TA的得分主题

发表于 2010-10-8 09:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-10-8 15:01 | 显示全部楼层
试了一下,可以实现排序,但是想改一下变成数据降序排列要怎么做?论坛里找不到相关的说明,哪位大大帮个手!谢谢!

TA的精华主题

TA的得分主题

发表于 2019-9-6 10:55 | 显示全部楼层
purpledragoon 发表于 2010-10-8 15:01
试了一下,可以实现排序,但是想改一下变成数据降序排列要怎么做?论坛里找不到相关的说明,哪位大大帮个手 ...

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    Dim i As Long
    With ListView1
        For i = 1 To .ColumnHeaders.Count '还原无三角形的标题
            .ColumnHeaders(i).Text = strTitle(i)
        Next
        If .SortKey = ColumnHeader.Index - 1 Then '排序设置,交替执行。每列第一次排序默认升序
            .SortOrder = IIf(.SortOrder, 0, 1)
        Else
            .SortKey = ColumnHeader.Index - 1
            .SortOrder = lvwAscending
        End If
        LvmSort ListView1, .SortKey, arrSort(.SortKey), .SortOrder '调用自定义排序程序
        
        ColumnHeader.Text = IIf(.SortOrder, "▼" & ColumnHeader.Text, "▲" & ColumnHeader.Text) '在标题上显示升降序三角,也可用ColumnHeader.Icon属性,只要在ImageList放置两个三角形图片
    End With
End Sub

Public Function LvmSort(lv As ListView, ByVal Index As Long, ByVal ItemType As LVItemTypes, ByVal SortOrder As LVSortTypes) As Boolean
    With lv
        .Sorted = False
        .SortKey = Index
        .SortOrder = SortOrder
        m_lvSortColumn = Index
        m_lvSortType = ItemType
        m_lvHWnd = .hwnd
        Call SendMessageLong(.hwnd, LVM_SORTITEMS, SortOrder, AddressOf LvmCompareProc)
    End With
End Function

Private Function LvmCompareProc(ByVal lParam1 As Long, ByVal lParam2 As Long, ByVal SortOrder As Long) As Long
    Dim dat1 As Date, dat2 As Date
    Dim dbl1 As Double, dbl2 As Double
    Dim str1 As String, str2 As String
    str1 = LvmGetItemText(lParam1, m_lvHWnd)
    str2 = LvmGetItemText(lParam2, m_lvHWnd)
    Select Case m_lvSortType
    Case lvAlphabetic
        LvmCompareProc = StrComp(str1, str2, vbTextCompare)
    Case lvNumber
        If IsNumeric(str1) Then dbl1 = CDbl(str1) Else dbl1 = -4.94065645841247E-324
        If IsNumeric(str2) Then dbl2 = CDbl(str2) Else dbl2 = -4.94065645841247E-324
        LvmCompareProc = Sgn(dbl1 - dbl2)
    Case lvDate
        If IsDate(str1) Then dat1 = CDate(str1) Else dat1 = CDate(0)
        If IsDate(str2) Then dat2 = CDate(str2) Else dat2 = CDate(0)
        LvmCompareProc = Sgn(dat1 - dat2)
    Case lvBinary
        LvmCompareProc = StrComp(str1, str2, vbBinaryCompare)
    Case Else
        LvmCompareProc = StrComp(str1, str2, vbTextCompare)
    End Select
    If SortOrder = lvDescending Then LvmCompareProc = -LvmCompareProc
End Function

Private Function LvmGetItemText(lParam As Long, hwnd As Long) As String
    Dim tpyFind As LV_FINDINFO
    Dim tpyItem As LV_ITEM
    Dim Index As Long
    Dim lngRet As Long
    With tpyFind
        .flags = LVFI_PARAM
        .lParam = lParam
    End With
    Index = SendMessage(hwnd, LVM_FINDITEM, -1, tpyFind)
    With tpyItem
        .Mask = LVIF_TEXT
        .SubItem = m_lvSortColumn
        .Text = Space(32)
        .TextMax = Len(.Text)
    End With
    lngRet = SendMessage(hwnd, LVM_GETITEMTEXT, Index, tpyItem)
    If lngRet Then LvmGetItemText = Left$(tpyItem.Text, lngRet)
End Function

TA的精华主题

TA的得分主题

发表于 2021-5-12 20:23 | 显示全部楼层
y1983y 发表于 2019-9-6 10:55
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    Dim i As Lo ...

数值部份无法正常依数值打小排序,仍然是依文字排序,如何解决呢?

TA的精华主题

TA的得分主题

发表于 2021-5-17 09:05 | 显示全部楼层
kiwihome 发表于 2021-5-12 20:23
数值部份无法正常依数值打小排序,仍然是依文字排序,如何解决呢?

试试这个是否满足您的需求
http://club.excelhome.net/thread-1244921-1-1.html

TA的精华主题

TA的得分主题

发表于 2023-6-28 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
拿笔小薪 发表于 2010-5-27 17:15
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
. ...

提示用户定义类型未定义是怎么回事呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 19:26 , Processed in 0.044797 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表