c# - ListView.RetrieveVirtualItem 事件到底是什么 - C#

标签 c# winforms listview .net-3.5

对于Winforms App中的Virtual ListView控件,RetrieveVirtualItem事件的所有功能是什么?

场景:有一个字典对象充当我的 ListView 缓存。其项目显示在 ListView 上。单击列时,缓存字典在内存中排序,ListView 被 Refresh()ed。 UI上的效果,ListView排序的很好。 :)

但我想了解 RetrieveVirtualItem 事件的作用是什么,它在 Refresh() 上触发。

在 RetrieveVirtualItem 事件处理程序中 [其他人的代码,:( ],完成以下操作:

  1. 基于RetrieveVirtualItemEventArgs.ItemIndex,从Cache中获取消息
  2. 设置 RetrieveVirtualItemEventArgs.Item = 上面检索到的项目

看来在事件处理程序中所做的事情很重要,因为如果我将其取出,ListView 就会哭泣。这个事件有什么意义?

编辑 或者让我重新表述这个问题...我担心的是,为什么在排序(和 RetrieveVirtualItem 事件处理程序)之后,所选项目仍保留在排序之前的位置。即,如果我选择项目 #5 并排序,并且如果排序使该项目成为最后一个项目,我更希望在排序之后选择最后一个项目。但在我的例子中,第 5 项是在排序后选择的。那么 RetrieveVirtualItem WRT selected item 的默认行为是什么?

最佳答案

虚拟 ListView 应该只为屏幕上当前可见的行调用 RetreiveVirtualItem。

当您在 ListView 中导航时,例如,您按下向下翻页键,ListView 将计算现在应该是顶行的索引,然后调用 RetrieveVirtualItem 以便您的代码可以提供要在每行索引。

除非您缓存或以其他方式存储您通过 RetrieveVirtualItem 提供的项目,否则一旦它们滚出 ListView ,它们将不再存在。

这就是 VirtualListView 中的 Virtual 的意思——没有任何真实的行,这些行是虚拟的。这就是它如何显示包含数十万行的列表 - 因为它实际上只会包含屏幕上可见的行数。

实际上,ListView 就像一个窗口,在您的内部数据列表中上下移动 - RetreiveVirtualItem 方法是它在移动时将项目移动到该窗口中的方法。它说,嘿,我刚搬到第 15 行 - 给我那一行的项目。它将继续为每个可见的行索引调用 RetreiveVirtualItem。如果 ListView 在屏幕上的高度为 5 行,您将收到 5 次对 RetrieveVirtualItem 的调用 - 即使支持 listview 的实际数据有 3000 个项目。每次 ListView 的顶行发生变化(由于导航),您都会收到 5 次对 RetrieveVirtualItem 的调用(情况并非总是如此,但这是正确的想法 - 例如,如果您向下滚动一行,它只会询问新的最后一行 - 它也会简单地丢弃用于滚出 View 的旧顶行的数据。

我想如果我们假设 ListView 在显示器上只有一行高(意味着屏幕上实际上只有一行是可见的),可能会更容易解释 - 当您在列表中上下移动 ListView 时的数据(即用户导航 ListView),它会在每次移动到新行时恰好调用一次 RetrieveVirtualItem。

希望对你有帮助... 祝你好运

关于c# - ListView.RetrieveVirtualItem 事件到底是什么 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512607/

相关文章:

android - 查看持有者 OnClickListener 事件问题

c# - 调整 Controller 操作中的参数名称以映射 HTTP 请求参数

c# - 请求方法和线程问题?

vb.net - 如何使用带有旋转和变换路径的 IsVisible 进行鼠标点击测试

c# - 优化绑定(bind)DataGridView搜索功能

android - Picasso on Adapter中Target的使用

Java Wicket 表单 : Error serializing object class 'myClassName'

C# 重新启动控制台应用程序

c# - 更改无线网络适配器无线模式属性

c# - 从 SQL Server 中选择一行,使用该信息执行 Web 请求,然后更新同一行