xwt620 发表于 2011-10-2 21:22:44

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

本帖最后由 xwt620 于 2011-10-11 21:01 编辑

RT,点击一个checkbox,则把listview里的所有的checkbox都设置为选中或取消,我以前喜欢用for循环方式来解决问题,想请教下有没有比这种更好,效率更高的方法。

pusofalse 发表于 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。

gzh888666 发表于 2011-10-2 21:54:03

用for应该是合理的,ListView控件没有提供 一次全选的消息命令。另外,使用这种方法的效率是否高效,还要看 ...
pusofalse 发表于 2011-10-2 21:44 http://www.autoitx.com/images/common/back.gif

为什么总有人说AU3的程序容易出错,还是功力不够,谢谢分享。

happytc 发表于 2011-10-2 22:04:21

RT,点击一个checkbox,则把listview里的所有的checkbox都设置为选中或取消,我以前喜欢用for循环方式来解决 ...
xwt620 发表于 2011-10-2 21:22 http://www.autoitx.com/images/common/back.gif

    好象不差这点效率吧,除非你的Items上十万级,对于几百个item而言,都是毫秒级的。
对了,LV最大Items数限制是多少个?

xms77 发表于 2011-10-2 23:00:10

回复 2# pusofalse
学习了,感谢P版!

netegg 发表于 2011-10-4 14:11:26

回复 4# happytc

单独创建好像没见过特殊的限制,如果是数组创建的话,估计是数组的要求,这好像和listview关系不大,没试过,只是猜的

happytc 发表于 2011-10-4 14:29:37

回复happytc

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

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

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

Example()

Func Example()
        Local $listview, $button, $item, $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

netegg 发表于 2011-10-8 20:50:36

回复 7# happytc

这倒是没注意过
页: [1]
查看完整版本: 选中checkbox的全选,把listview中的checkbox都选中的算法【已解决】