需求:隱藏寬度為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)
uj5u.com熱心網友回復:
方便除錯的實體:http://pan.baidu.com/s/1kVj5kQbuj5u.com熱心網友回復:
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《程式員指南》。
uj5u.com熱心網友回復:
轉變一下思路,不想被看到的資料為啥一定要放在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
uj5u.com熱心網友回復:
我想實作的是可以隨時通過設定某列的列寬達到隱藏和顯視的目的.uj5u.com熱心網友回復:
換控制元件吧,比如 Xtreme SuitePro ActiveX 的Report控制元件。直接就實作你的要求了。uj5u.com熱心網友回復:
控制元件做好了,想還個功能,能選擇所要顯視的列,就差這個功能了,各位能幫出個主意嗎,我的代嗎能改改嗎
uj5u.com熱心網友回復:
很簡單的功能啊,建一個是否隱藏的標記陣列,維數是列數,值是0或1,加載列時,去判斷一下,0加載,1隱藏不加載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/51416.html
標籤:API
