C# 如何以虚拟模式异步填充ListView?

C# 如何以虚拟模式异步填充ListView?,c#,winforms,listview,asynchronous,virtualmode,C#,Winforms,Listview,Asynchronous,Virtualmode,我希望在listview中显示数据库中的记录,但检索可能需要很长时间。我可以使用RetrieveVirtualItem来告诉我何时需要一个新的ListViewItem,添加一个虚拟项,然后开始检索;但是当数据库返回记录时,我该如何处理它呢?当ListView处于VirtualMode时,我无法更新ListView的Items集合。有没有办法告诉ListView重新加载项目?或者我可以保留对ListViewItem的引用并填充它吗?如果这两种方法都不起作用,那么如何以虚拟模式异步填充ListVie

我希望在listview中显示数据库中的记录,但检索可能需要很长时间。我可以使用RetrieveVirtualItem来告诉我何时需要一个新的ListViewItem,添加一个虚拟项,然后开始检索;但是当数据库返回记录时,我该如何处理它呢?当ListView处于VirtualMode时,我无法更新ListView的Items集合。有没有办法告诉ListView重新加载项目?或者我可以保留对ListViewItem的引用并填充它吗?如果这两种方法都不起作用,那么如何以虚拟模式异步填充ListView?

当ListView需要更新时,将调用RetrieveVirtualItem处理程序。如果数据尚不可用且无法等待,则必须创建一个虚拟项(不处理RetrieveVirtualItem将引发异常)

一旦数据准备就绪,就可以使控件无效-这将为每个可见项再次调用RetrieveVirtualItem。作为使整个控件无效的替代方法,您可以使用ListView控件的RedrawItems方法来控制要重画哪些项,该方法在虚拟和常规模式下工作:

听起来,如果需要一段时间的话,分批下载你的记录可能是值得的。此外,如果您的数据库操作非常昂贵,那么缓存ListItems是值得研究的(您需要处理一个CacheVirtualItems事件):

我希望这有帮助