2008-10-09 57 views
1

我正在使用List Control来显示矢量中元素的表示形式。在另一个控件上单击列表时,显示有关该元素的信息。元素的索引当前由控件中的索引决定,但如果我想对结果进行排序或过滤,则不再有效。虚拟列表控件(MFC)

有人告诉我,我可以使用虚拟列表控件,但MSDN是不是很友好,能有人跑我通过我如何使用这个虚拟列表控件?

谢谢! :)

回答

5

坦率地说 - 搭售数据(数据载体的位置),以在列表控件(列表中的位置Ctrl)数据的呈现是我会远离。

在MFC每个控制有一个“数据” DWORD成员变量 - 在MFC编码时我始终称为“SetItemData”为每个项目添加并且在相关行参照的指针传递例如 YourListCtrl.SetItemData((DWORDPTR)&YourData);

然后选择的ListCtrl项目时,你只需要调用

DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));

或者诸如此类的东西。

或者 - 如果你不想使用指针 - 按住该项目的索引中的ItemData你行你原来的载体(只是将它传递到上述FNS)。

+0

+1 这将解决您的排序问题。所有者数据(虚拟)不是答案。 – 2008-10-09 19:18:56

1

要使用虚拟列表控件,请设置LVS_OWNERDATA样式。然后您需要处理LVN_GETDISPINFO通知消息(通过WM_NOTIFY发送)。

如果你这样做,你完全负责数据,包括它的显示顺序。因此,由您来处理排序等等。

到目前为止,最简单的方法就是使用项目数据来设置/获取可用于检索原始数据的ID,无论这是一个向量索引还是指向数据的指针,甚至是一个键入关联容器。

1

这实际上取决于你需要的性能。

我个人看过主要增加的数据表海量数据列表的性能。然而,它是更多的工作实施,因此对于没有太多数据的简单用途,我建议远离它。

基本上,虚拟列表控件的情况是,你在你自己的一些数据结构某处有你的数据。由于列表视图仅显示整个数据的一小部分,因此它会在发生任何事情时询问您要显示的内容(重绘必需,向上滚动或向下滚动,更改排序等)。

我没有方便的例子给你。但是你可以看看codeguru,我确信有很好的例子可以从头开始。

1

虚拟列表控件的目的是完全不同的:当你的项目很多在你的列表(我会说2500+)你应该使用它的性能的原因。

就你的情况而言,你所需要的只是将向量索引存储在列表项数据中,正如NotJarvis解释的那样。