【问题标题】:1-million-row ListView100 万行 ListView
【发布时间】:2017-12-01 02:50:31
【问题描述】:

我有一个 SysListView32,它可能会容纳数百万行,以及三列文本 A、B、C,每列

假设 B 列有很多重复(例如:A 列是文件名,B 列是路径,每一行是文件系统的一个文件),并且只有 10 万个不同的值(而不是几百万个)。

是否可以避免ListView GUI 元素的 B 列内容在 RAM 中重复?

我们可以用数组元素(取自 B 列的不同值的 100k 元素数组)的 指针 填充 ListView,而不是重复数据吗?

如何修改它以使其工作?

LV_ITEM item;
item.mask = LVIF_TEXT;
item.pszText = "Hello";
...
ListView_SetItem(hList, &item);

【问题讨论】:

  • @IInspectable 看起来确实很有趣,我读了几次,但我可能需要再读 10 次才能完全理解。也许您认为我们可以找到一个完整的 MSVC++ 玩具项目来演示这一点,其中包含一个真正的具体 ListView 填充行?
  • 其实没什么大不了的。您使用LVS_OWNERDATA 样式创建列表视图,将指向原始数据的指针存储在LVITEM.lParam 中,并处理LVN_GETDISPINFO 消息。
  • 我经常这样做。现在您知道要研究什么,您将轻松解决这个问题。
  • @IInspectable store a pointer to the raw data in LVITEM.lParam 这是虚拟列表的错误。它不为项目分配数据,也不存储任何lParam。需要使用NMLVDISPINFO.item.iItem

标签: windows listview user-interface winapi syslistview32


【解决方案1】:

您需要的也称为“虚拟列表”。虚拟列表控件是具有LVS_OWNERDATA 样式的列表视图控件。此样式使控件能够支持最多为 DWORD 的项目计数(默认项目计数仅扩展到 int)。然而,这种风格提供的最大优势是能够在任何时候只在内存中拥有一个数据项的子集。这允许虚拟列表视图控件将自己用于大型信息数据库,其中访问数据的特定方法已经到位。对于给定的一组数据(列表或动态数组),您需要按照以下步骤操作:

  1. 将 LVS_OWNERDATA 样式添加到您的 ListView
  2. 调用 CListCtrl::SetItemCount 传递数据源大小,如 std::vector::size()。
  3. 捕获 LVN_GETDISPINFO 通知。这是将数据呈现到 ListCtrl 中的位置。

请查看我添加的附加链接,了解更多信息和示例代码。如果您使用 CListView,您可以通过 GetListCtrl 访问 CListCtrl。

链接:

Virtual List Controls

Using virtual lists

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多