【问题标题】:Remove specific items from a listbox in MFC从 MFC 中的列表框中删除特定项目
【发布时间】:2011-06-06 13:15:55
【问题描述】:
CString dance[] = {L"Atb", L"Tiesto", L"Madonna", L"Paul van Dyk", L"Armin van Burren", L"Jennifer Lopez"};

for(int i = 0; i < m_ItemsListBox.GetCount(); ++i)
{
    CString item;
    int length = m_ItemsListBox.GetTextLen(i);
    m_ItemsListBox.GetText(i, item.GetBuffer(length));
    for(int j = 0; j < sizeof(dance)/sizeof(*dance); ++j)
    {
        if(item != dance[j])
        {
            m_ItemsListBox.DeleteString(i);
        }
    }
}

我正在尝试从列表框(m_ItemsListbox) 中删除所有不属于 CString 数组的元素。但是我如何编码它不起作用,因为如果第一个元素不同,它将删除它而不搜索整个数组。

这似乎不是一项艰巨的任务,但我真的不知道该怎么做。我认为一种方法应该是使用 CList 而不是数组,因为它有一个 find() 方法,但我不喜欢它,因为我必须手动添加所有元素,你们还有其他想法吗?还是只有 CList 解决方案?

对不起,我是 MFC 初学者。感谢您的宝贵时间。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    嗯,在遍历列表框中的项目时,我不喜欢从列表框中删除内容,这似乎是在询问问题。 老实说,你可以做这样的事情,我刚刚拼凑起来 - 构建一个你想要删除的所有项目索引的列表,并在最后删除它们。

    CList<int, int> ListIndexItemsToRemove;
    
    for(int i = 0; i < m_ItemsListBox.GetCount(); ++i)
    {
        CString item;
        int length = m_ItemsListBox.GetTextLen(i);
        m_ItemsListBox.GetText(i, item.GetBuffer(length));
    
        bool isMatchFound = false;
        for(int j = 0; j < sizeof(dance)/sizeof(*dance); ++j)
        {
            if(item == dance[j])
            {
                isMatchFound = true;
            }
        }
        if (!isMatchFound)
             ListIndexItemsToRemove.AddHead(i);
    }
    for(int i = 0; i < ListIndexItemsToRemove.GetCount(); ++i)
          m_ItemsListBox.DeleteString(ListIndexItemsToRemove.GetAt(ListIndexItemsToRemove.FindIndex(i));
    

    但是 - 正如 Martin 所说,每次发生变化时清除整个列表并重新填充它可能会更好(如果它不影响任何东西的话。

    【讨论】:

    • Martin 解决方案会影响代码,但是关于您的代码,为什么我得到“无法从 int 转换为 POSITION”,getAt() 不是返回 int 吗? :-/
    • 抱歉 - 忘记了 GetAt 是如何工作的 - 它使用列表中某个位置的“位置”位置。行应该更像 GetAt(ListIndexItemsToRemove.FindIndex(i)) 之类的。示例:msdn.microsoft.com/en-us/library/et138h3x(v=vs.71).aspx Gawd 我讨厌 CList - 你有更好的使用吗?我记得 stl::Lists 和 vector 更好。
    【解决方案2】:

    对于动态列表,我倾向于将数据存储在其自己的变量中,并在数据更改时清除/重新填充列表。尤其是随着列表变得越来越大,重新添加字符串往往比通过列表和/或原始源进行搜索要快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2022-01-08
      • 2019-03-17
      • 2018-05-03
      相关资源
      最近更新 更多