Listview 隐藏列的方法

蜂歌 2017-09-15 10:04:59
需求:隐藏宽度为0的列,并且不能被拖出来显视,实现真正的隐藏。
现有的方法只能通过API固定所有列不能拖动,所以求解
Option Explicit

Public Type NMHDR
hwndFrom As Long
idFrom As Long
code As Long
End Type

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_NOTIFY = &H4E

Public Const HDN_FIRST = -300
Public Const HDN_DIVIDERDBLCLICKA = HDN_FIRST - 5
Public Const HDN_DIVIDERDBLCLICKW = HDN_FIRST - 25
Public Const HDN_BEGINTRACKA = HDN_FIRST - 6
Public Const HDN_BEGINTRACKW = HDN_FIRST - 26

Private lpPrevWndFunc As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_NOTIFY
Dim X As NMHDR
CopyMemory X, ByVal lParam, Len(X)
If X.code = HDN_BEGINTRACKA Or X.code = HDN_BEGINTRACKW Or _
X.code = HDN_DIVIDERDBLCLICKA Or _
X.code = HDN_DIVIDERDBLCLICKW Then
WindowProc = 1
Exit Function
End If
End Select
WindowProc = CallWindowProc(lpPrevWndFunc, hWnd, uMsg, wParam, lParam)
End Function

Public Sub LockHead(ByVal hWnd As Long)
lpPrevWndFunc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnLockHead(ByVal hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, lpPrevWndFunc
End Sub

调用: Call LockHead(Listview1.hWnd)
Call UnLockHead(Listview1.hWnd)
...全文
5266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
vansoft 2017-12-04
  • 打赏
  • 举报
回复
引用 6 楼 huangjingfeng88 的回复:
控件做好了,想还个功能,能选择所要显视的列,就差这个功能了,各位能帮出个主意吗,我的代吗能改改吗
很简单的功能啊,建一个是否隐藏的标记数组,维数是列数,值是0或1,加载列时,去判断一下,0加载,1隐藏不加载。
蜂歌 2017-09-21
  • 打赏
  • 举报
回复
控件做好了,想还个功能,能选择所要显视的列,就差这个功能了,各位能帮出个主意吗,我的代吗能改改吗
蜂歌 2017-09-20
  • 打赏
  • 举报
回复
我想实现的是可以随时通过设置某列的列宽达到隐藏和显视的目的.
笨狗先飞 2017-09-20
  • 打赏
  • 举报
回复
换控件吧,比如 Xtreme SuitePro ActiveX 的Report控件。直接就实现你的要求了。
赵4老师 2017-09-18
  • 打赏
  • 举报
回复
ListView 控件 ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 语法 ListView 说明 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一: 大(标准)图标 小图标 列表 报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。 ListView 控件包括 ListItem 和 ColumnHeader 对象。ListItem 对象定义 ListView 控件中项目的各种特性,诸如: 项目的简要描述。 由 ImageList 控件提供的与项目一起出现的图标。 附加的文本片段,称作子项目,它们与显示在报表视图中的 ListItem 对象关联。 可以使用 HideColumnHeaders 属性决定是否在 ListView 控件中显示列标头。列标头可以在设计时添加,也可以在运行时添加。设计时,使用 ListView“控件属性”对话框的“列首”选项卡添加列标头。运行时,使用 Add 方法添加 ColumnHeader 对象到 ColumnHeaders 集合中。 发行注意 ListView 控件是 Mscomctl.ocx 文件中一组 ActiveX 控件的一部分。若要在应用程序中使用 ListView 控件,则必须将 Mscomctl.ocx 文件添加到工程中。当发行应用程序时,请将 Mscomctl.ocx 文件安装到用户的 Microsoft Windows System 或 System32 目录下。关于如何将 ActiveX 控件添加到 Visual Basic 工程的详细信息,请参阅 Visual Basic《程序员指南》。
脆皮大雪糕 2017-09-18
  • 打赏
  • 举报
回复
转变一下思路,不想被看到的数据为啥一定要放在listview里面?目的不就是为了让客户选择某一行的时候你能得到这个隐藏的数据么,将这列数据添加到对应的数组或者集合里面也可以实现。 你发的例子的声明区和form load稍微改一下,加一个item被点击的事件,演示一下隐藏列。 只不过在item新增和删除的时候不要忘记同步修改集合里面的内容。


Dim colHideCol As New Collection '定义一个模块级的集合用于存放隐藏的东西
Private Sub Form_Load()
    Dim i As Integer
    Dim mRow As ListItem
    Me.ScaleMode = vbTwips
  '---------------------------
  '初始化
  '--------------------------
    lv.View = lvwReport
    lv.FullRowSelect = True
    lv.Checkboxes = True
    lv.ColumnHeaders.Add , , "序号"
    lv.ColumnHeaders.Add , , "标题"
    lv.ColumnHeaders.Add , , "标题1", 0   '这列宽度为0 但是可以被拉开
    
    For i = 1 To colHideCol.Count '初始化清空一下
        colHideCol.Remove (1)
    Next
    For i = 0 To 40
      Set mRow = lv.ListItems.Add(, , CStr(i))
      mRow.SubItems(1) = "欢迎光临枕善居网站,谢谢 " & i
      colHideCol.Add "不显示的列" & i, "K" & mRow.Index  '这里把不想显示的列放入同步处理的集合里
    Next
  
   lv.ListItems(3).Checked = True
   lv.ListItems(5).Checked = True
   lv.ListItems(13).Checked = True
   lv.ListItems(23).Checked = True
   lv.ListItems(6).Checked = True
   lv.ListItems(9).Checked = True
   

End Sub


Private Sub lv_ItemClick(ByVal Item As MSComctlLib.ListItem)
    MsgBox "该行隐藏列内容:" & colHideCol.Item("K" & Item.Index)
End Sub
蜂歌 2017-09-15
  • 打赏
  • 举报
回复
方便调试的实例:http://pan.baidu.com/s/1kVj5kQb
c# xptable NET中最强,最全功能的表格控件 可以定制一个ListView,能够在中插入图像、下拉框、可上下调整的数字、进度条等等。 [功能] 全定制可视化界面 支持XP风格 轻易添加再定制的控件 可隐藏 行、、单元可以被Disable 每个单元、可以有Tooltip 等等…… [XPTable] XPTable包含下面的组件: 1. Table, 2. ColumnModel 和它的 Columns, 3. TableModel 和它的 Row 和 Cell, 4. Renderer 5. Editor [翻译] Mathew Hall.著XPTable - .NET ListView meets Java's JTable [简介] 由于项目需要,我需要定制一个ListView,它必须能够在中插入图像、下拉框、可上下调整的数字、进度条等等。由于已经有了一个Java下的背景,我将简单地基于那个JTable封装。 [功能] 全定制可视化界面 支持XP风格 轻易添加再定制的控件 可隐藏 行、、单元可以被Disable 每个单元、可以有Tooltip 等等…… [XPTable] XPTable包含下面的组件: 1. Table, 2. ColumnModel 和它的 Columns, 3. TableModel 和它的 Row 和 Cell, 4. Renderer 5. Editor [控件使用] 首先加载控件到Toolbox上(添加一个Item,引用XPTable.dll) 然后,拖动Table, ColumnModel 和 TableModel到Form上,设置Table的ColumnModel 和 TableModel属性,添加Column到ColumnModel,添加Row 和 Cell到TableModel.

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧