2014-09-02 136 views
2

我已經創建了非常標準的ListView。C++ ListView隱藏項目

RECT rec; 
    GetClientRect(hwnd, &rec); 
    ListView = CreateWindow(WC_LISTVIEW, (LPCSTR)L"", (WS_CHILD | WS_VISIBLE | LVS_REPORT), 0, 0, rec.right, rec.bottom-23, hwnd, (HMENU)8553, GetModuleHandle(NULL), NULL); 
    SendMessage(ListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); // Set style 

現在我插入一些列這樣的:

LVCOLUMNW listColumnW = { 0 }; 
    listColumnW.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
    listColumnW.pszText = L"Column1"; 
    listColumnW.cx = 150; 
    listColumnW.fmt = LVCFMT_LEFT; 
    SendMessage(ListView,LVM_INSERTCOLUMNW, 0, (LPARAM)&listColumnW); 

之後我instert項目和子項目

LVITEMW lisW = { 0 }; 
    lisW.mask = LVIF_TEXT | LVIF_PARAM; 
    lisW.pszText = item_text[i]; 
    lisW.iItem = i; 
    lisW.lParam = i; 
    SendMessage(ListView, LVM_INSERTITEMW, 0, (LPARAM)&lisW); 

現在我想實現某種形式的搜索/過濾。 我看到很多人建議刪除/重新插入項目,但是因爲在我的列表視圖中有相當多的項目不是最好的解決方案。 谷歌搜索時,我得知應該可以設置項目的組ID和設置狀態(隱藏它)。 但是我不確定如何做到這一點,可以說我有我的列表視圖中有10個項目,我想隱藏一些項目,我到底該怎麼做?

編輯:

我已設置LVM_ENABLEGROUPVIEW和創建的兩組,一組是應該顯示和其他一個隱藏。

LVGROUP group = { 0 }; 
    group.cbSize = sizeof(LVGROUP); 
    group.mask = LVGF_GROUPID; 
    group.iGroupId = 10;//shown 
    ListView_InsertGroup(ListView, -1, &group); 
    group.iGroupId = 11;//hidden 
    group.mask = LVGF_GROUPID | LVGF_STATE; 
    group.stateMask = LVGS_HIDDEN; 
    group.state = LVGS_HIDDEN; 
    ListView_InsertGroup(ListView, -1, &group); 

現在我已經添加了一些項目這兩個羣體,唯一的問題是,我可以看到他們倆(他們是分開的),而其他人都應該被隱藏。

+0

嘗試增加'LVGS_NOHEADER'和'LVGS_COLLAPSED'第二組的'state'。顯然只需設置'LVGS_HIDDEN'隱藏組標題而不是組中的項目,但是如果您摺疊「隱藏」組,則其項目將不會顯示。 – 2014-09-04 01:10:27

+0

謝謝,它工作。然而,改變groupid並沒有比添加項目更快,是的,我已經完成了所有的優化,比如只將id改變爲改變組的項目。對於約40 000個項目,它可能需要一分鐘,所以我確實會嘗試虛擬列表。 – Dan 2014-09-04 09:03:08

回答

6

使用LVM_SETITEM經由LVITEM::iGroupId成員列表項目指定給特定的組:

LVITEMW lisW = { 0 }; 
lisW.mask = ... | LVIF_GROUPID; 
... 
lisW.iItem = ...; 
lisW.iGroupId = ...; 
SendMessage(ListView, 0, (LPARAM)&lisW); 

您可以使用LVM_INSERTGROUP插入一個隱藏的組,或使用LVM_SETGROUPINFO隱藏現有組,通過設置LVGROUP::state成員LVGS_HIDDEN

LVGROUP grp = { 0 }; 
grp.cbSize = sizeof(grp); 
grp.mask = LVGF_STATE; 
grp.iGroupId = ...; 
grp.stateMask = LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED; 
grp.state = LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED; 

SendMessage(ListView, LVM_INSERTGROUP, -1, (LPARAM)&grp); 
or: 
SendMessage(ListView, LVM_SETGROUPINFO, grp.iGroupId, (LPARAM)&grp); 

通過LVM_ENABLEGROUPVIEW事先確保已啓用組:

SendMessage(ListView, LVM_ENABLEGROUPVIEW, TRUE, 0); 

這就是說,當你有很多項目在ListView中顯示/搜索/過濾時,通常最好使用virtual mode中的ListView代替。您可以根據需要預先篩選數據,然後使用LVM_SETITEMCOUNT指定要顯示的項目數量,然後在ListView向您請求時處理LVN_GETDISPINFO以檢索特定項目的數據。這樣,您可以直接在數據源中執行所有搜索/過濾(內存,數據庫等),然後在顯示新數據時使用LVM_REDRAWITEMS無效ListView中需要刷新的部分。當您有要添加/刪除的項目時,您只需重新發送LVM_SETITEMCOUNT。這是處理大量列表項目的更快更靈活的方式。

Using virtual lists

+0

我創建了兩個組,一個顯示項目和其他隱藏的項目。現在我有一個問題,實際上我的隱藏組不隱藏。更多信息附加到第一篇文章。 – Dan 2014-09-04 00:34:10