c++ ListView - 使用 ListView_DeleteAllItems 后无法插入新项目

Posted

技术标签:

【中文标题】c++ ListView - 使用 ListView_DeleteAllItems 后无法插入新项目【英文标题】:c++ ListView - Cannot insert new items after using ListView_DeleteAllItems 【发布时间】:2012-08-11 13:09:27 【问题描述】:

我有一个在 WM_CREATE 过程中初始化的具有 4 列的 ListView 控件。

        hListView1 = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL, WS_CHILD|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|LVS_REPORT|LVS_SHOWSELALWAYS, 230, 20, 300, 250, hwnd, (HMENU)ID_EDIT1, GetModuleHandle(NULL), NULL);
        ListView_SetExtendedListViewStyle(hListView1, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
            lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
        lvCol.fmt = LVCFMT_LEFT;

        lvCol.iSubItem=0;
        lvCol.cx=30;
        lvCol.pszText="";
        ListView_InsertColumn(hListView1, 0, &lvCol);

        lvCol.iSubItem=1;
        lvCol.cx=150;
        lvCol.pszText="Name";
        ListView_InsertColumn(hListView1, 1, &lvCol);

        lvCol.iSubItem=2;
        lvCol.cx=50;
        lvCol.pszText="Size";
        ListView_InsertColumn(hListView1, 2, &lvCol);

        lvCol.iSubItem=3;
        lvCol.cx=80;
        lvCol.pszText="Modified";
        ListView_InsertColumn(hListView1, 3, &lvCol);

然后我有一个可以插入项目的函数(在我调用 deleteallitems 之前它工作正常)

...
LVITEM lvItem;
j = 0;
while(FindNextFile(hFind,&FindFileData))
lvItem.iItem = j;
        lvItem.iImage = 1;
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            lvItem.iImage = 0;
        
        ListView_InsertItem(hListView1, &lvItem);
        ListView_SetItemText(hListView1, j, 1, FindFileData.cFileName);
        ListView_SetItemText(hListView1, j, 2, msg1);
        ListView_SetItemText(hListView1, j, 3, msg2);
        j++;

但是每当我打电话时

ListView_DeleteAllItems(hListView1);

如果在我调用插入项目的函数后,我的列表视图被清除(列仍然存在)但没有插入新项目.. 我听说索引没有被清除,但我想不通。

提前致谢 ;-)

解决方案: 添加了

    lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = 0;
lvItem.stateMask = 0;
lvItem.iSubItem = 0;

【问题讨论】:

正确初始化您的LVITEM。除了.iItem.iImage 之外,当您将垃圾传递给_InsertItem 时,您会将垃圾留在那里。 感谢 Roman,这就是问题所在,LVITEM 没有正确初始化。谢谢 【参考方案1】:

您没有设置lvItem.mask,所以ListView_InsertItem 不知道哪些字段有效,哪些无效。

试试这样的:

...
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_DI_SETITEM;
j = 0;
...

【讨论】:

添加了 lvItem.mask = LVIF_IMAGE | LVIF_状态; lvItem.state = 0; lvItem.stateMask = 0; lvItem.iSubItem = 0;谢谢:-)

以上是关于c++ ListView - 使用 ListView_DeleteAllItems 后无法插入新项目的主要内容,如果未能解决你的问题,请参考以下文章

在 ListView [mvvm] 中过滤数据

ListView添加节点

关于理解布局单位

c#将list集合直接绑定到listview控件

手把手教你做视频播放器

列表视图--ListView相关类及其适配器