豌豆战士 发表于 2014-1-10 17:41:54

Listview 虚拟模式下 是否支持图标显示?

本帖最后由 豌豆战士 于 2014-1-10 17:43 编辑

如题.能否给出详细的说明.

heimuheimulm 发表于 2014-1-10 18:13:03

虚拟模式没用过,姑且猜想一下:虚拟模式是加载海量数据用的,几十万甚至上百万的数据,如果加载图标,程序的性能肯定很低,折中一下,图片列数据保存的是图片的路径,反正不推荐。

推荐方法:使用数据分页。

豌豆战士 发表于 2014-1-13 17:16:52

heimuheimulm 发表于 2014-1-10 18:13
虚拟模式没用过,姑且猜想一下:虚拟模式是加载海量数据用的,几十万甚至上百万的数据,如果加载图标,程序 ...

能从内部分析一下吗?(代码实现方面)
追问:虚拟模式下,视图选择“小图标”视图。能支持checkbox吗?
谢谢!

heimuheimulm 发表于 2014-1-14 19:27:16

由于没有用过,学习了一堆网上材料后,自己试验虚拟模式可以支持图标:
出于程序性能考虑,建议提前把需要加载的图标读入内存,不要运行时加载。
至于加载checkbox,后面再带有图片这个暂时没有什么好方法,如果在subitems中加载图标还要自己画,性能更低,继续研究吧。

/////////////////////////测试环境/////////////////////////
IDE: SharpDevelop 4.4
       .Net Framework 4.5.1
///////////////////////////////////////////////////////////

代码片段:
private ImageList _imageList;
///////////////程序Load时加载图标至内存/////////////
_imageList = new ImageList();
_imageList.Images.Add("F:\1.png");   // ImageIndex = 0
_imageList.Images.Add("F:\2.png");   // ImageIndex = 1
listView1.SmallImageList = _imageListSmall;
listView1.LargeImageList = _imageListSmall;

///////////////listView1_CacheVirtualItems///////////////
var lvi = new ListViewItem("图标1", 0);

豌豆战士 发表于 2014-1-15 09:14:30

heimuheimulm 发表于 2014-1-14 19:27
由于没有用过,学习了一堆网上材料后,自己试验虚拟模式可以支持图标:
出于程序性能考虑,建议提前把需要加 ...

虚拟模式下,是不能访问 Listview.Items。按照你所说的方法在虚拟模式下不能添加图标吧?

heimuheimulm 发表于 2014-1-15 16:37:24

我明白你的意思,你所说的ListView.Items是指ListView控件在填入数据的时候不是用Collection.Add()这种方法,正确。
ListView开启VirtualMode模式的精髓就在有个缓冲集合,这个缓冲集合的各种数据就在CacheVirtualItems这个事件中被组合成为一个集合Collection,然后在RetrieveVirtualItem这个事件中把集合中的数据赋给ListView,通过
e.Item = collection; 这种方法。

简而言之:
CacheVirtualItems事件生成一个缓冲集合
RetrieveVirtualItem事件通过e.Item = collection;这种方法把集合中的数据赋给控件

豌豆战士 发表于 2014-1-15 17:56:37

heimuheimulm 发表于 2014-1-15 16:37
我明白你的意思,你所说的ListView.Items是指ListView控件在填入数据的时候不是用Collection.Add()这种方法 ...

懂了,大神啊。膜拜膜拜!{:3_52:}

heimuheimulm 发表于 2014-1-15 20:32:23

{:2_26:}
虚拟模式以前没听说过,所以一下子就激起了我的兴趣。{:2_35:}

我已经写了个程序,用来比较普通ListView和开启虚拟模式的ListView效率,差别很大,稍后放出。
普通1000条数据带图标,界面有明显卡顿现象。
虚拟模式下50000条数据带图标也没见卡顿。
至于原理还没有搞明白,再研究吧。{:2_35:}

豌豆战士 发表于 2014-1-22 17:46:22

heimuheimulm 发表于 2014-1-15 20:32
虚拟模式以前没听说过,所以一下子就激起了我的兴趣。

我已经写了个程序,用来比较普通L ...

代码写得怎样了,求共享

heimuheimulm 发表于 2014-1-23 07:22:57

额。。。前几天都发过了。。。{:2_25:}

发到winform板块去了,地址如下:
【Winform】ListView虚拟模式与普通模式的性能对比

【Winform】ListView虚拟模式与普通模式的性能对比 -- 深入分析

豌豆战士 发表于 2014-1-23 09:07:00

heimuheimulm 发表于 2014-1-23 07:22
额。。。前几天都发过了。。。

发到winform板块去了,地址如下:


啧啧···3KS
页: [1]
查看完整版本: Listview 虚拟模式下 是否支持图标显示?