我已经创建了非常标准的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);
现在我已经添加了一些项目这两个群体,唯一的问题是,我可以看到他们俩(他们是分开的),而其他人都应该被隐藏。
尝试增加'LVGS_NOHEADER'和'LVGS_COLLAPSED'第二组的'state'。显然只需设置'LVGS_HIDDEN'隐藏组标题而不是组中的项目,但是如果您折叠“隐藏”组,则其项目将不会显示。 – 2014-09-04 01:10:27
谢谢,它工作。然而,改变groupid并没有比添加项目更快,是的,我已经完成了所有的优化,比如只将id改变为改变组的项目。对于约40 000个项目,它可能需要一分钟,所以我确实会尝试虚拟列表。 – Dan 2014-09-04 09:03:08