为什么在RetrieveItem之前没有调用ListView.CacheVirtualItems?

时间:2016-08-26 22:04:04

标签: c# winforms listview user-interface virtualmode

我有一个表单(.NET 4.5 VS.2015),其中包含一个可能包含几百甚至一千多行的ListView。实验表明,表单陷入困境并且没有响应,因为它在任何给定时间只显示大约20个时会尝试加载所有ListViewItem。

因此,我使用简单的缓存在ListView上实现了虚拟模式。我为RetrieveItems和CacheVirtualItems事件设置了VirtualListSize,启用了虚拟模式并连接了事件处理程序。

现在,根据文档,您可以相信在RetrieveItems之前调用CacheVirtualItems,以允许使用ListView打算查看的项目范围填充缓存。

但是对于我所看到的,在第一个RetrieveItems之前永远不会调用CacheVirtualItems!您可能希望它被调用,以便您可以创建缓存并预填充它(至少设置容量),然后适当填充缓存未命中。

我不理解什么吗?如果首先不调用CacheVirtualItems让您的应用程序为请求做准备,那么重点是什么?

1 个答案:

答案 0 :(得分:1)

WinForm ListView是本机控件的包装器,虽然看起来希望在RetrieveVirtualItem之前引发CacheVirtualItems事件,但本机控件的行为排除了这一点。备注部分中LVN_ODCACHEHINT的文档说明:

  

请注意,此通知代码并不总是LVN_GETDISPINFO请求的项目的精确表示。因此,如果在处理LVN_GETDISPINFO时未缓存请求的项目,则应用程序必须准备好从缓存外部的源提供所请求的信息。

这些是Listview控件在引发相关事件时响应的消息。 See the code for the ListView WMReflectNotify method从第6010行开始。