macran 发表于 2015-4-19 03:57:02

LISTVIEW 清空不卡顿

本帖最后由 macran 于 2015-4-19 04:01 编辑

Terence 兄遇到了一个问题:http://www.autoitx.com/forum.php?mod=viewthread&tid=35292&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,$findnum)

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

;#cs ------方法2 后插
   
      GUICtrlCreateListViewItem (""&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|" _
                &$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames&"|"&$aNames _
                &"|"&$aNames&"|"&$aNames&"|"&$aNames,$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)
经过测试,很好用,不管前一次后一次查询多么不同。一点也不闪。
当然如果数据量巨大,就需要虚拟列表了。
如果有更好办法的,请多多指教!!

netegg 发表于 2015-4-20 11:49:01

实在看不明白你想的效果是什么
页: [1]
查看完整版本: LISTVIEW 清空不卡顿