2014-09-02 137 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