2011-06-06 71 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

對於動態列表,我傾向於將數據存儲在其自己的變量中,並在數據更改時清除/重新填充列表。特別是作爲該列表變得更大重新添加字符串往往比通過列表和/或原始來源做搜索快得多。