开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 8365|回复: 10

[求助] Listview 虚拟模式下 是否支持图标显示?

[复制链接]

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
发表于 2014-1-10 17:41:54 | 显示全部楼层 |阅读模式
本帖最后由 豌豆战士 于 2014-1-10 17:43 编辑

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

使用道具 举报

0

精华

2

贡献

254

赞扬

帖子
166
软币
4472
在线时间
698 小时
注册时间
2013-6-26
发表于 2014-1-10 18:13:03 | 显示全部楼层
虚拟模式没用过,姑且猜想一下:虚拟模式是加载海量数据用的,几十万甚至上百万的数据,如果加载图标,程序的性能肯定很低,折中一下,图片列数据保存的是图片的路径,反正不推荐。

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

使用道具 举报

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
 楼主| 发表于 2014-1-13 17:16:52 | 显示全部楼层
heimuheimulm 发表于 2014-1-10 18:13
虚拟模式没用过,姑且猜想一下:虚拟模式是加载海量数据用的,几十万甚至上百万的数据,如果加载图标,程序 ...

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

使用道具 举报

0

精华

2

贡献

254

赞扬

帖子
166
软币
4472
在线时间
698 小时
注册时间
2013-6-26
发表于 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);  
回复

使用道具 举报

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
 楼主| 发表于 2014-1-15 09:14:30 | 显示全部楼层
heimuheimulm 发表于 2014-1-14 19:27
由于没有用过,学习了一堆网上材料后,自己试验虚拟模式可以支持图标:
出于程序性能考虑,建议提前把需要加 ...

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

使用道具 举报

0

精华

2

贡献

254

赞扬

帖子
166
软币
4472
在线时间
698 小时
注册时间
2013-6-26
发表于 2014-1-15 16:37:24 | 显示全部楼层
我明白你的意思,你所说的ListView.Items是指ListView控件在填入数据的时候不是用Collection.Add()这种方法,正确。
ListView开启VirtualMode模式的精髓就在有个缓冲集合,这个缓冲集合的各种数据就在CacheVirtualItems这个事件中被组合成为一个集合Collection,然后在RetrieveVirtualItem这个事件中把集合中的数据赋给ListView,通过
e.Item = collection[e.ItemIndex]; 这种方法。

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

使用道具 举报

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
 楼主| 发表于 2014-1-15 17:56:37 | 显示全部楼层
heimuheimulm 发表于 2014-1-15 16:37
我明白你的意思,你所说的ListView.Items是指ListView控件在填入数据的时候不是用Collection.Add()这种方法 ...

懂了,大神啊。膜拜膜拜!
回复

使用道具 举报

0

精华

2

贡献

254

赞扬

帖子
166
软币
4472
在线时间
698 小时
注册时间
2013-6-26
发表于 2014-1-15 20:32:23 | 显示全部楼层

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

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

使用道具 举报

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
 楼主| 发表于 2014-1-22 17:46:22 | 显示全部楼层
heimuheimulm 发表于 2014-1-15 20:32
虚拟模式以前没听说过,所以一下子就激起了我的兴趣。

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

代码写得怎样了,求共享
回复

使用道具 举报

0

精华

2

贡献

254

赞扬

帖子
166
软币
4472
在线时间
698 小时
注册时间
2013-6-26
发表于 2014-1-23 07:22:57 | 显示全部楼层
回复

使用道具 举报

0

精华

1

贡献

0

赞扬

帖子
33
软币
450
在线时间
79 小时
注册时间
2013-12-18
 楼主| 发表于 2014-1-23 09:07:00 | 显示全部楼层
heimuheimulm 发表于 2014-1-23 07:22
额。。。前几天都发过了。。。

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

啧啧···3KS
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-23 13:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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