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

本文关键字:调用 CacheVirtualItems ListView RetrieveItem 为什么 | 更新日期: 2023-09-27 18:04:08

我有一个表单。. NET 4.5 VS.2015),其中的ListView可能包含几百甚至超过1000行。实验已经表明,表单陷入困境和无响应,因为它试图加载所有的listviewitem,而在任何给定的时间只有大约20个显示。

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

现在,根据文档,你应该相信CacheVirtualItems会在RetrieveItems之前被调用,以允许你的缓存填充ListView打算在视图中包含的项目范围。

但是就我所见,CacheVirtualItems在第一个RetrieveItems之前从来没有被调用过!您希望调用它,以便您可以创建缓存并预填充它(至少设置容量),然后在缓存丢失时适当填充。

我理解不太好吗?如果没有首先调用CacheVirtualItems来让应用程序为请求做准备,那么还有什么意义呢?

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

WinForm ListView是本机控件的包装器,虽然在retrievevvirtualitem之前引发CacheVirtualItems事件似乎是可取的,但本机控件的行为排除了这一点。备注部分中LVN_ODCACHEHINT的文档说明:

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

这些是Listview控件在引发有问题的事件时响应的消息。参见从第6010行开始的ListView WMReflectNotify方法的代码。