gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:45:28 32 4
gpt4 key购买 nike

对于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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com