2011-06-06 66 views
0
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数组的一部分。但是,我如何编码它不工作,因为如果第一个元素的不同就将它删除,而不搜索整个数组。删除MFC中的列表框中的特定项目

不似乎是一个艰巨的任务,但我真的没有爱迪如何做到这一点。我想一个方法应该是使用数组的栏列表,而不是因为它有一个find()方法,但我不喜欢它,因为我必须手动添加的所有元素,做你们有另一个爱迪?或者CList解决方案是唯一的解决方案?

对不起,我是一个MFC初学者。谢谢你的时间。

回答

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

但是 - 这可能是更好的清除整个列表,每次填充它有新的变化,如马丁说,(如果它不造成任何影响

+0

马丁的解决方案将影响码,但关于你的。代码,为什么我得到“不能从int转换为POSITION”,isnt getAt()返回一个int?: -/ – Kobe 2011-06-06 14:05:57

+0

对不起 - 忘了GetAt的工作方式 - 它使用列表中位置的“Position”Pos Line应该更像GetAt(ListIndexItemsToRemove.FindIndex(i))或其他东西。 示例:http://msdn.microsoft.com/en-us/library/et138h3x(v=vs.71).aspx Gawd我讨厌CList - 你有吗一个更好的使用? stl ::列表和向量更好,我记得。 – NotJarvis 2011-06-06 14:29:26

2

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