C++ ListView hide item
C++ ListView hide item
我已经创建了相当标准的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);
之后我插入项目和子项目
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);
现在我想实现某种搜索/过滤。我看到很多人建议删除/重新插入项目,但由于我的列表视图中有很多项目不是最佳解决方案。在谷歌搜索时,我了解到应该可以设置groupid和项目状态(隐藏它)。然而,我不知道该怎么做,比如说我的列表视图中有10个项目,我想隐藏一些项目,我该怎么做?
编辑:
我设置了LVM_ENABLEGRUPVIEW并创建了两个组,一个应该显示,另一个隐藏。
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);
现在我已经向两个组添加了一些项目,唯一的问题是我可以同时看到它们(它们是分开的),而另一个应该是隐藏的。
使用LVM_SETITEM
通过LVITEM::iGroupId
成员将列表项分配给特定组:
LVITEMW lisW = { 0 };
lisW.mask = ... | LVIF_GROUPID;
...
lisW.iItem = ...;
lisW.iGroupId = ...;
SendMessage(ListView, 0, (LPARAM)&lisW);
通过将LVGROUP::state
成员设置为LVGS_HIDDEN
:,可以使用LVM_INSERTGROUP
插入隐藏组,或使用LVM_SETGROUPINFO
隐藏现有组
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中有很多项目要显示/搜索/筛选时,通常最好在虚拟模式下使用ListView。您可以根据需要预先筛选数据,然后使用LVM_SETITEMCOUNT
指定要显示的项目数,然后在ListView向您请求特定项目的数据时处理LVN_GETDISPINFO
以检索这些数据。通过这种方式,您可以直接在数据源中(在内存、数据库等中)进行所有搜索/筛选,然后在有新数据要显示时,只需使ListView中需要在屏幕上使用LVM_REDRAWITEMS
刷新的部分无效即可。当您有要添加/删除的项目时,只需重新发送LVM_SETITEMCOUNT
即可。这是一种处理大量列表项的更快、更灵活的方法。
使用虚拟列表
- C++:如何正确设置 "Item" 类
- 数组 X[n] 仅存储名称.编写算法以在数组中插入或删除 ITEM
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- Hide vtkOutputWindow
- CMake: Hide -WShadow global compile flag for child target
- 为什么不能从 QVector 将 Item 添加到 QGraphicsScene <QGraphicsItem>中?
- 防止 QGraphicsItem::itemAt() 在"Background Item"上
- 按列进行排序后,如何从qtablewidget :: item(qt bug?)中获取正确的行
- std :: vector :: erase(item)需要为项目定义的分配操作员
- xrces item returning NULL
- 使用工厂时如何"hide"构造函数?
- Qt - QStringList to QListWidget*item
- 创建"Item"定义
- 未在qgraphicsItem上调用ItemChange.Item会解覆盖标志
- 致命错误 C1083:无法打开包含文件:"Item.h":没有此类文件或目录
- 为什么编译器说我不能将项插入到 std::set 中<Item>?
- QInputDialog.getItem() get item index
- QT QTableWidget::item() 返回 nullptr,即使分配给它的 widget
- 为什么我会收到错误"Array type Item[1000] is not assignable"?
- C++ ListView hide item