在列表控制(MFC)中删除重复项

Removing duplicates in List Control (MFC)

本文关键字:删除 列表 控制 MFC      更新时间:2023-10-16

所以,我一直在努力防止在列表控制中添加文本/项目重复(它是由文件浏览器添加的)。我正在为我的定制需求开发一个新的dll注入器,这是我面临的唯一问题,我一直在努力修复,但它仍然不是最好的选择。

我一直在努力做的事情:

CFileDialog FileDialog(TRUE, L"*.*",    NULL, OFN_HIDEREADONLY, L"Dynamic Link Library (*.dll)|*.dll||");
    if (FileDialog.DoModal() == IDOK)
    {
        CString DllName = FileDialog.GetFileName();
        DllPathes.push_back(FileDialog.GetPathName());
        LVFINDINFO tempFind;
        tempFind.psz = DllName;
        tempFind.flags = LVFI_STRING;
        if (DllBox.FindItem(&tempFind))
        {
            DllBox.InsertItem(0, DllName);
        }
    } 

假设您的DllBox变量是CListCtrl,那么我想知道为什么您不检查FindItem的返回值,因为您当前的表达式将始终评估为true,除非索引为0。

返回值:
如果成功则为项的索引,否则为-1。


if (DllBox.FindItem(&tempFind) == -1) //Not found !
{
    DllBox.InsertItem(0, DllName);
}

如果您也将新选择的路径存储在容器DllPathes中,为什么不也在这个容器中搜索,并阻止它被添加?

CString csSelected = FileDialog.GetPathName();
std::find(DllPathes.begin(), DllPathes.end(), [&](const CString &c)
                                              {return csSelected.Compare(c);});

你还应该考虑给你的变量起一个小写字母开头的名字。特别是对于MFC类,你可能很快就会感到困惑。FileDialog可以从CFileDialog继承的类,或者它是一个变量?你甚至可以看到Stackoverflow完成的格式化 !