找回密码  加入

AUTOIT CN

搜索
查看: 3302|回复: 1

[GUI管理] LISTVIEW 清空不卡顿

[复制链接]
发表于 2015-4-19 03:57:02 | 显示全部楼层 |阅读模式
本帖最后由 macran 于 2015-4-19 04:01 编辑

Terence 兄遇到了一个问题:http://www.autoitx.com/forum.php ... ;highlight=listview
我摸索了半天,解决了。
先说明一下,既然要delete 说明已经不是第一次查询显示了,LISTVIEW 一般是结合数据库。因为数据库查询可能也需要时间。如果清空早了LV一片空白也不爽。beginupdate也没用,所以我是放弃了_GUICtrlListView_DeleteAllItems。
我的解决办法是,第一次之后的查询就GUICtrlCreateListViewItem  (这个函数是新查结果在上次LV项目后面添加,叫他后插)或者
_GUICtrlListView_AddSubItem(这个函数可以定位所以可以覆盖,新查结果从上次LV0项目开始覆盖,叫他前插),但因为每次查询结果的数量是不知道的,可能比上次少,也可能比上次多。也可能一样。
所以,设个变量取得新的LISTVIEW的counts 然后
如果是后插就从第一列开始删除,至到项目索引0是你新查询的数据开始的那个索引为止;
如果是前插就从最后一列开始删除,至到项目索引是你新查询的数量为止。
  1. _GUICtrlListView_BeginUpdate($Listview1)
  2.         $findnum=0       
  3. While _SQLite_FetchData ($hQuery,$aNames)=$SQLITE_OK
  4.                
  5. #cs ------方法1 前插
  6. _GUICtrlListView_InsertItem($listview1,$aNames[0],$findnum)

  7. ; _GUICtrlListView_AddItem($listview1,$aNames[0]) ;这个不要用,否则数据显示错误。
  8.                
  9.                 _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[1],1)
  10.         _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[2],2)
  11. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[10],3)
  12. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[4],4)
  13. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[5],5)
  14. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[3],6)
  15. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[6],7)
  16. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[7],8)
  17. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[8],9)
  18. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[9],10)
  19. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[11],11)
  20. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[12],12)
  21. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[13],13)
  22. _GUICtrlListView_AddSubItem($listview1,$findnum,$aNames[14],14)
  23. #ce

  24. ;#cs ------方法2 后插
  25.      
  26.         GUICtrlCreateListViewItem (""&"|"&$aNames[0]&"|"&$aNames[1]&"|"&$aNames[2]&"|"&$aNames[10]&"|"&$aNames[4]&"|" _
  27.                 &$aNames[5]&"|"&$aNames[3]&"|"&$aNames[6]&"|"&$aNames[7]&"|"&$aNames[8]&"|"&$aNames[9]&"|"&$aNames[11] _
  28.                 &"|"&$aNames[12]&"|"&$aNames[13]&"|"&$aNames[14],$ListView1)
  29. ;#ce
  30. $findnum+=1
  31. ;GUICtrlSetBkColor(-1,0xdcdcdc);隔行背景不同
  32.            WEnd
  33.           Local $listcount1= _GUICtrlListView_GetItemCount($Listview1);前后查询形成的LV的项目数量
  34.        
  35.        If $listcount1>$findnum Then
  36.                   ;#cs ----方法2 对应后插 删除前一次查询结果
  37.                    For $i=$listcount-1 To 0 Step -1
  38.               _GUICtrlListView_DeleteItem($listview1,0) ;一定要每次删除索引0
  39.                    Next
  40.                   ; #ce
  41.                 ;----方法1 前插 删除前一次查询结果
  42.                 #cs
  43.                 For $i=$listcount1-1 To $findnum Step -1
  44.                           _GUICtrlListView_DeleteItem($listview1,$i);这个删除索引就要变化了。
  45.                 Next
  46.                 #ce
  47.       EndIf
  48. _GUICtrlListView_EndUpdate($ListView1)
复制代码
经过测试,很好用,不管前一次后一次查询多么不同。一点也不闪。
当然如果数据量巨大,就需要虚拟列表了。
如果有更好办法的,请多多指教!!
发表于 2015-4-20 11:49:01 | 显示全部楼层
实在看不明白你想的效果是什么
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2020-7-12 23:22 , Processed in 0.156250 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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