2008-10-09 105 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解釋的那樣。