我使用列表控件来显示向量中元素的表示形式。当单击列表时,另一个控件会显示有关该元素的信息。元素的索引当前由它在控件中的索引确定,但是,如果我希望对结果进行排序或过滤,这将不再起作用。
有人告诉我可以使用虚拟列表控件,但MSDN不是很友好,有人能告诉我如何使用虚拟列表控件吗?
发布于 2008-10-09 14:28:19
坦率地说,将数据(数据向量中的位置)绑定到列表控件中的数据表示(列表ctrl中的位置)是我不会去做的事情。
在MFC中,每个控件都有一个"Data“DWORD成员变量--在MFC中编码时,我总是为添加的每一项调用"SetItemData”,并将其传递给相关行引用的指针,例如YourListCtrl.SetItemData((DWORDPTR)&YourData);
然后,当选择ListCtrl项时,您只需调用
DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));
或者诸如此类的事情。
或者-如果您不想使用指针-在行的itemdata中保留原始向量中项目的索引(只需将其传递到上面的fns中)。
发布于 2008-10-09 14:59:16
若要使用虚拟列表控件,请设置LVS_OWNERDATA样式。然后,您需要处理(通过WM_NOTIFY发送的) LVN_GETDISPINFO通知消息。
如果这样做,您将完全对数据负责,包括数据的显示顺序。因此,要由您来处理排序等问题。
到目前为止,最简单的方法是使用项数据来设置/获取一个ID,该ID可用于检索原始数据,无论是向量索引还是指向数据的指针,甚至是关联容器中的键。
发布于 2008-10-09 15:21:13
这真的取决于你所需要的性能。
我个人已经看到,拥有大量数据的列表的性能有了很大的提高。然而,这是更多的工作来实现,因此,对于简单的使用没有太多的数据,我建议远离它。
基本上,使用虚拟列表控件所发生的情况是,您的数据存在于您自己的某个数据结构中。由于列表视图只显示整个数据的一小部分,因此当发生任何事情(必要的重绘、向上或向下滚动、更改排序等)时,它都会询问要显示的内容。
我没有现成的例子供你参考。但是你可以看看codeguru,我很确定有非常好的例子可以开始。
https://stackoverflow.com/questions/187421
复制相似问题