找回密码
 加入
搜索
查看: 3970|回复: 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是你新查询的数据开始的那个索引为止;
如果是前插就从最后一列开始删除,至到项目索引是你新查询的数量为止。
_GUICtrlListView_BeginUpdate($Listview1)
        $findnum=0        
 While _SQLite_FetchData ($hQuery,$aNames)=$SQLITE_OK
                
#cs ------方法1 前插
_GUICtrlListView_InsertItem($listview1,$aNames[0],$findnum)

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

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

本版积分规则

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

GMT+8, 2024-4-20 12:05 , Processed in 0.077800 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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