330259789
发表于 2017-12-4 09:26:27
必须回复啊
eaglelin
发表于 2017-12-4 09:50:30
谢谢楼主分享。
mayygttg
发表于 2017-12-13 21:24:57
谢谢分享,研究一下
jiexiao
发表于 2017-12-17 15:50:43
现在回复算不算挖坟
beastwars
发表于 2017-12-17 22:01:18
不错啊。很实用啊。。
cqliuz
发表于 2017-12-22 18:52:54
回复 1# 298311657
谢谢分享!!。。
3131210
发表于 2018-2-27 13:04:03
参考参考。。。。
qwerty
发表于 2018-3-5 11:11:02
支持一下..
nhnhwsnh
发表于 2018-3-5 12:35:19
回复 1# 298311657
这个必须要学习一下~~~
mikezunya
发表于 2018-3-17 15:21:38
感谢楼主分享
kk_lee69
发表于 2018-3-22 22:56:02
回复 1# 298311657
請問 圖標 可以加在SUBITEM 嗎
298311657
发表于 2018-3-26 18:10:05
回复 177# kk_lee69
使用下面的方法:_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SUBITEMIMAGES)); ++++++++++++++++++++++++允许显示子项目图像这是完整示例:#cs ____________________________________
Au3 版本: 3.3.14.2
脚本作者: CrossDoor
电子邮件: 382869232@qq.com
QQ/TM: 382869232
#ce _______________脚本开始_________________
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
#include <GuiEdit.au3>
#include <array.au3>
Global $B_DESCENDING ; 排序用数组
Global $hEdit, $Item = -1, $SubItem = 0
Local $tText = DllStructCreate("wchar Text");建个结构,用来放listview列数据
Local $GUI, $hImage, $iITEM_COUNT = 10000
Local $sSomeString = ""
Local $aShowdata[$iITEM_COUNT]
For $i = 0 To $iITEM_COUNT - 1;初始化数组
$aShowdata[$i] = "爷爷" & $i
$aShowdata[$i] = "爸爸" & $i
$aShowdata[$i] = "儿子" & $i
$aShowdata[$i] = 4096;复选框状态 4096未选中 8192选中
Next
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$hGUI = GUICreate("ListView虚表 加载[" & $iITEM_COUNT & "]数据 复选框 原地编辑例子 By_Crossdoor", 500, 350)
$hListView = GUICtrlCreateListView("Item1|nSubItem1|nSubItem2", 2, 2, 494, 294, $LVS_SHOWSELALWAYS + $LVS_OWNERDATA, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SUBITEMIMAGES)); ++++++++++++++++++++++++允许显示子项目图像
;设置列宽
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, 150)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 1, 150)
GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 2, 150)
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);设定数据总数
;===========创建并关联图像列表
$hImage = _GUIImageList_Create()
_GUIImageList_SetIconSize($hImage, 32, 16); ++++++++++++++++++++++++设置图像列表大小
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)
_GUICtrlListView_SetImageList($hListView, $hImage, 1);分配图像列表到列表视图控件
$Button3 = GUICtrlCreateButton("修改", 180, 310, 75, 25)
$Button4 = GUICtrlCreateButton("清空", 260, 310, 75, 25)
GUISetState()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case -3
ExitLoop
Case $Button3
If StringLen($sSomeString) Then
$sSomeString = ""
Else
$sSomeString = Asc(Random(48, 255, 1))
EndIf
For $i = 0 To $iITEM_COUNT - 1
$aShowdata[$i] = "爷爷" & $i & "-" & $sSomeString
$aShowdata[$i] = "爸爸" & $i & "-" & $sSomeString
$aShowdata[$i] = "儿子" & $i & "-" & $sSomeString
Next
GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
Case $Button4
$aShowdata = 0
$iITEM_COUNT = 0
GUICtrlSendMsg($hListView, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0)
GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
EndSwitch
WEnd
GUIDelete()
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $s
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Local $iIndex = DllStructGetData($tNMHDR, 'Index')
Switch $iIDFrom
Case $hListView
Switch $iCode
Case $LVN_COLUMNCLICK ; 点击列头排序
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
$iSub = DllStructGetData($tInfo, "SubItem")
_ArraySort($aShowdata, $B_DESCENDING[$iSub], 0, 0, $iSub)
GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
$B_DESCENDING[$iSub] = Not $B_DESCENDING[$iSub]
Case $NM_CLICK;单击
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
$iIndex = DllStructGetData($tInfo, "Index")
$x = DllStructGetData($tInfo, "X")
If ($x < 16) And (3 < $x) And (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then;使用x坐标来判断是否在复选框上点击
If $aShowdata[$iIndex] = 4096 Then
$aShowdata[$iIndex] = 8192;4096未选中 8192选中
Else
$aShowdata[$iIndex] = 4096;4096未选中 8192选中
EndIf
$tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
DllStructSetData($tInfo, "State", $aShowdata[$iIndex]);设置复选框状态
;====立刻刷新复选框显示状态 重绘$iIndex-1到$iIndex+20的项
GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, $iIndex - 1, $iIndex + 20)
EndIf
Case $NM_DBLCLK ; 双击
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
$iIndex = DllStructGetData($tInfo, "Index")
$iSub = DllStructGetData($tInfo, "SubItem")
$x = DllStructGetData($tInfo, "X")
If ($iIndex <> -1) And ($iSub >= 0) And ($x > 16) Then;点击的x>16才响应原地编辑
$Item = $iIndex
$SubItem = $iSub
;==========计算编辑框坐标
Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSub)
Local $iEdit_X = $aRect + 4
Local $iEdit_Y = $aRect + 3
Local $iEdit_Width = _GUICtrlListView_GetColumnWidth($hListView, $iSub) + 3
Local $iEdit_Height = $aRect - $aRect + 3
If $iSub = 0 Then
Local $i1=0,$i2=0
If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then $i1=18;判断是否有复选框
If _GUICtrlListView_GetImageList($hListView,1) Then $i2=20;判断是否有分配图像列表到列表视图控件
$iEdit_X += ($i2+$i1)
$iEdit_Width -= ($i2+$i1)
EndIf
$hEdit = _GUICtrlEdit_Create($hWnd, $aShowdata[$iIndex][$iSub], $iEdit_X, $iEdit_Y, $iEdit_Width, $iEdit_Height, BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT))
_WinAPI_SetFocus($hEdit)
Send("{RIGHT}")
_GUICtrlEdit_SetSel($hEdit, 0, -1)
HotKeySet("{ENTER}", "_EndItemEdit");设置热键响应回车
EndIf
Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177 请求显示数据
If Not IsArray($aShowdata) Then ContinueCase
$tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
$iIndex = Int(DllStructGetData($tInfo, "Item"))
$iSub = Int(DllStructGetData($tInfo, "SubItem"))
If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0);判断0列是否有LVIF_IMAGE属性,有则设置列图像
If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) And $iSub = 0 Then ;++++++++++++++++++++++++在0列设置复选框信息,同列也可以在子列设置复选框,但子列选中操作需另写代码
DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE,DllStructGetData($tInfo, "Mask")))
DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)
DllStructSetData($tInfo, "State", $aShowdata[$iIndex])
EndIf
DllStructSetData($tText, "Text", $aShowdata[$iIndex][$iSub]);列数据放入$tText结构
DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));用$tText结构的指针来设置列数据
DllStructSetData($tInfo, "TextMax", StringLen($aShowdata[$iIndex][$iSub]));设置列数据长度
If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 1 Then DllStructSetData($tInfo, "Image", 0); ++++++++++++++++++++++++判断是否子列1是否有LVIF_IMAGE属性,有则设置列图像,其它子列同理
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
$iIDFrom = _WinAPI_LoWord($wParam)
$iCode = _WinAPI_HiWord($wParam)
Switch $lParam
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
_EndItemEdit()
Case $EN_UPDATE
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func _EndItemEdit()
If ($Item < UBound($aShowdata,1)) And ($SubItem < UBound($aShowdata,2)) Then
Local $sText = _GUICtrlEdit_GetText($hEdit)
_GUICtrlListView_SetItemText($hListView, $Item, $sText, $SubItem)
_WinAPI_DestroyWindow($hEdit)
If ($Item >= 0) Then
$aShowdata[$Item][$SubItem] = $sText
GUICtrlSendMsg($hListView, $LVM_ENSUREVISIBLE, 1, 0)
GUICtrlSendMsg($hListView, $LVM_REDRAWITEMS, 0, 20)
EndIf
$Item = -1
$SubItem = 0
HotKeySet("{ENTER}");取消回车热键
EndIf
EndFunc
kk_lee69
发表于 2018-4-2 00:09:16
回复 5# wangms
老大有上線幫我看一下
关于listview虚表直接读取数据库的方法,求助修改范例成SQL的!!
官网有个范例 是listview虚表 直接拿SQLlite 的数据库 当作 listview虚表的数据 直接使用,这样的好处是 即使你的数据再多 也是分次 读取 就不会卡了
无奈 小弟 对于 SQLLITE的 UDF 实在没辙,我研究了半天 总是搞不懂原理
无法改成 把SQL DB 当作数据库来源的方法 ,所以上来求助
listview虚表 我已经很熟了所以理论上不应该是我不会使用,只是以前的方法都是读进
数组然后 利用数组 当作listview虚表 的数据源
只是最近遇到了 数据太多 读进数组太慢想要改成 分次读取 分次秀出的方法
所以才把脑筋动到了 数据库上……
看看 可不可以給個範例
志艺风云
发表于 2018-4-2 10:44:40
这个要看看,谢谢楼主分享。
志艺风云
发表于 2018-4-3 12:49:55
这个好,看看怎么搞。
页:
2
3
4
5
6
7
8
9
10
11
[12]
13
14
15
16
17