如何在VB中利用listview快速显示10000以上的记录

hjker007 2010-07-09 11:57:05
加精
listview显示起来美观,可就是速度不行

比如下面的方式
For i = 0 To 10000
ListView1.ListItems.Add ListView1.ListItems.Count + 1, , ListView1.ListItems.Count + 1
ListView1.ListItems.Item(ListView1.ListItems.Count).SubItems(1) = ("你好啊")
ListView1.ListItems.Item(ListView1.ListItems.Count).SubItems(2) = ("你好啊")
ListView1.ListItems.Item(ListView1.ListItems.Count).SubItems(3) = ("你好啊")
Next i

用逐个添加速度很慢,看到一个avafind软件,几万行的数据显示出来只要零点几秒

请问各位高手如何在VB中实现listview的快速显示呢?只要没有停顿感就好。

如果能解决,可再加100分
...全文
6493 138 打赏 收藏 转发到动态 举报
写回复
用AI写文章
138 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAASSS111YP 2013-03-15
  • 打赏
  • 举报
回复
学习了,真厉害!
yczhz 2012-08-22
  • 打赏
  • 举报
回复
做个标记也许用得着
echoxiageVV 2012-08-21
  • 打赏
  • 举报
回复
很不错 学习下
mqlbeyond 2011-09-02
  • 打赏
  • 举报
回复
学习学习。。。。
hyjavahy 2011-03-01
  • 打赏
  • 举报
回复
太牛了,http://www.mvps.org/vbvision/Sample_Projects.htm#Virtual_ListView_Demo
kewei320 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 bcrun 的回复:]
引用 12 楼 hjker007 的回复:
VB里边listview的virtual模式不知道怎么用,不是很明白

也许他用的是分页,可滚动条如何处理呢?


http://www.mvps.org/vbvision/Sample_Projects.htm#Virtual_ListView_Demo

另外,你还可以搜一下Virtual_ListView_Demo
[/Quote]
英文版的 看不懂。。。。。
intel810 2010-12-06
  • 打赏
  • 举报
回复
呵呵
hjker007 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 125 楼 myjian 的回复:]
......如果是我遇到这需求,我会自己做一个滚动条,然后根据滚动条位置决定当前ListView中应该显示的内容.

比如界面中只能显示50条,而记录有1000W条,那我就将滚动条的范围设置为25到1000W-25条.

这样每次拖动滚动条时,我只需要加载前后25条数据一共50条,想慢都慢不起来.........
[/Quote]

这个方式已经实现了,也是这个帖子里朋友提供的,缺点就是拖动滚动条时有延时,比如用户想将滚动条一下拖到最后这时就不好弄了。

再次感谢yunyu97的回复
嗷嗷叫的老马 2010-07-30
  • 打赏
  • 举报
回复
反正界面也就那么大,你一次添加进去有必要么.

数据量大的话,什么控件也显示不了啊.
嗷嗷叫的老马 2010-07-30
  • 打赏
  • 举报
回复
......如果是我遇到这需求,我会自己做一个滚动条,然后根据滚动条位置决定当前ListView中应该显示的内容.

比如界面中只能显示50条,而记录有1000W条,那我就将滚动条的范围设置为25到1000W-25条.

这样每次拖动滚动条时,我只需要加载前后25条数据一共50条,想慢都慢不起来.........
yangxie5201314 2010-07-29
  • 打赏
  • 举报
回复
留着,备用
yunyu97 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 122 楼 hjker007 的回复:]
我现在用的以下的方式来实现了显示,这样确实提高了效率,数组中2W条记录用的2秒左右,
这个时间使用mscecond记录的(我对API基本不懂,也不知道准确不准确)

但是想要实现0.1秒内完成利用控件本身的添加方法恐怕是不行地,
关于Virtual模式还没弄懂,如果有人了解告知一下吧,谢谢阿。

lsvFileShow2.Enabled = False
lsvFileShow.Ena……
[/Quote]
你这里面还有可以优化的地方,将你的For循环变成For Each,再在循环里面针对FileArray里的元素使用With,应该还可以快点。然后你可以将程序编译后执行,应该会再快点。
hjker007 2010-07-19
  • 打赏
  • 举报
回复
我现在用的以下的方式来实现了显示,这样确实提高了效率,数组中2W条记录用的2秒左右,
这个时间使用mscecond记录的(我对API基本不懂,也不知道准确不准确)

但是想要实现0.1秒内完成利用控件本身的添加方法恐怕是不行地,
关于Virtual模式还没弄懂,如果有人了解告知一下吧,谢谢阿。

lsvFileShow2.Enabled = False
lsvFileShow.Enabled = False
lsvFileShow.ListItems.Clear
msecond = timeGetTime()
Dim nItems1 As ListItems
Dim nItems2 As ListItems
Dim nItem As ListItem
Dim Scount As Long
Dim Fcount As Long
Set nItems1 = lsvFileShow.ListItems
Set nItems2 = lsvFileShow2.ListItems
For i = 1 To FileCount
If FileArray(i).FileFlag = True Then
Set nItem = nItems1.Add(nItems1.Count + 1, , FileArray(i).FileNum)
nItem.SubItems(1) = FileArray(i).FileName
nItem.SubItems(2) = FileArray(i).FilePath
Scount = Scount + 1
Else
Set nItem = nItems2.Add(nItems2.Count + 1, , FileArray(i).FileName)
nItem.SubItems(1) = FileArray(i).FileType
nItem.SubItems(2) = FileArray(i).FilePath
nItem.SubItems(3) = FileArray(i).Description
Fcount = Fcount + 1
End If
Next i
Label10.Caption = " 显示 " & timeGetTime() - msecond & "毫秒 采集 " & CStr(Scount) & " 个 未采集 " & CStr(Fcount) & " 个"
lsvFileShow2.Enabled = True
lsvFileShow.Enabled = True
r11222 2010-07-16
  • 打赏
  • 举报
回复
lai 10 ge ke yong fen
newnazi 2010-07-16
  • 打赏
  • 举报
回复
留名,学习。
tangmao510 2010-07-16
  • 打赏
  • 举报
回复
学习中,进来看看!
battery2006 2010-07-16
  • 打赏
  • 举报
回复
学习先,
yaowpeng 2010-07-15
  • 打赏
  • 举报
回复
学习学习,以后会用到
richgong 2010-07-15
  • 打赏
  • 举报
回复
----關注
pzowen 2010-07-15
  • 打赏
  • 举报
回复
学习了···
加载更多回复(110)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧