找回密码
 加入
搜索
查看: 4229|回复: 7

[效率算法] 选中checkbox的全选,把listview中的checkbox都选中的算法【已解决】

  [复制链接]
发表于 2011-10-2 21:22:44 | 显示全部楼层 |阅读模式
本帖最后由 xwt620 于 2011-10-11 21:01 编辑

RT,点击一个checkbox,则把listview里的所有的checkbox都设置为选中或取消,我以前喜欢用for循环方式来解决问题,想请教下有没有比这种更好,效率更高的方法。
发表于 2011-10-2 21:44:56 | 显示全部楼层
本帖最后由 pusofalse 于 2011-10-2 21:46 编辑

用for应该是合理的,ListView控件没有提供 一次全选的消息命令。另外,使用这种方法的效率是否高效,还要看在for循环内部的语句是怎样写的。 如果Item数量较多,应该在for之前使用 _GUICtrlListView_BeginUpdate函数暂停ListView控件的重绘,在for之后调用_GUICtrlListView_EndUpdate解除锁定,一旦使用了这两个函数,那在for循环之内,就没必要使用_GUICtrlListView_GetItemChecked来进行判断,应该直接调用_GUICtrlListView_SetItemChecked函数。
如果在调用_GUICtrlListView_SetItemChecked函数时,ListView控件向父窗口发送WM_NOTIFY消息,那么在for之前也应该用GUIRegisterMsg($WM_NOTIFY, "")来取消截取WM_NOTIFY消息,这样 消息函数就不会执行,效率也会因此提升,全部选中之后,再在for之后使用GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") 来重新注册WM_NOTIFY。

评分

参与人数 3金钱 +30 收起 理由
xwt620 + 10
xms77 + 10
gzh888666 + 10

查看全部评分

发表于 2011-10-2 21:54:03 | 显示全部楼层
用for应该是合理的,ListView控件没有提供 一次全选的消息命令。另外,使用这种方法的效率是否高效,还要看 ...
pusofalse 发表于 2011-10-2 21:44


为什么总有人说AU3的程序容易出错,还是功力不够,谢谢分享。
发表于 2011-10-2 22:04:21 | 显示全部楼层
RT,点击一个checkbox,则把listview里的所有的checkbox都设置为选中或取消,我以前喜欢用for循环方式来解决 ...
xwt620 发表于 2011-10-2 21:22


    好象不差这点效率吧,除非你的Items上十万级,对于几百个item而言,都是毫秒级的。
对了,LV最大Items数限制是多少个?
发表于 2011-10-2 23:00:10 | 显示全部楼层
回复 2# pusofalse
学习了,感谢P版!
发表于 2011-10-4 14:11:26 | 显示全部楼层
回复 4# happytc

单独创建好像没见过特殊的限制,如果是数组创建的话,估计是数组的要求,这好像和listview关系不大,没试过,只是猜的
发表于 2011-10-4 14:29:37 | 显示全部楼层
回复  happytc

单独创建好像没见过特殊的限制,如果是数组创建的话,估计是数组的要求,这好像和listview关 ...
netegg 发表于 2011-10-4 14:11


有的,试了下面的代码,最多只能创建Items数是65530,而数组是1600万个元素。
显然,au3还是把Item当作控件了,因为au3最多只能在每个窗口中的GUI控件的最大数量: 65532

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
        Local $listview, $button, $item[1000000], $msg

        GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
        GUISetBkColor(0x00E0FFFF) ; will change background color

        $listview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
        $button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
        For $i = 0 To UBound($item) - 1
                $item[$i] = GUICtrlCreateListViewItem("item" & $i & "|col" & $i & "|col" & $i, $listview)
        Next
        GUICtrlCreateInput("", 20, 200, 150)
        GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
        GUISetState()
        ;GUICtrlSetData($item2, "ITEM1")
        ;GUICtrlSetData($item3, "||COL33")
        ;GUICtrlDelete($item1)

        Do
                $msg = GUIGetMsg()

                Select
                        Case $msg = $button
                                MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
                        Case $msg = $listview
                                MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
                EndSelect
        Until $msg = $GUI_EVENT_CLOSE
EndFunc
发表于 2011-10-8 20:50:36 | 显示全部楼层
回复 7# happytc

这倒是没注意过
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-21 03:35 , Processed in 0.082971 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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