从MFC中的列表框中删除特定项目

时间:2011-06-06 13:15:56

标签: c++ mfc

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初学者。谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

对于动态列表,我倾向于将数据存储在自己的变量中,并在数据更改时清除/重新填充列表。特别是当列表变得更大时,重新添加字符串往往比在列表和/或原始源中搜索更快。

答案 1 :(得分:2)

嗯,我不习惯从列表框中删除内容,而迭代列表框中的项目似乎是在寻找问题。 老实说,你可以做这样的事情,我只是鞭打在一起 - 构建一个你要删除的所有项目索引的列表,并在最后删除它们。

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));

但是 - 最好清除整个清单,并在每次发生变化时重新填写,如马丁所说(如果它不会影响任何事情。