如何删除MFC中列表控件的选定行?

时间:2013-12-30 12:23:33

标签: mfc listcontrol

我想在MFC中删除列表控件的选定行。 我已经创建了一个删除按钮,所以如果选择任何行(可能是一行或多行),我按删除按钮/那些行应该被删除。 如果让我说有100行并且我从50-60中选择行,则应删除此范围内的所有行,其余行应具有1到90之间的索引。这意味着删除后索引也应该正确。

3 个答案:

答案 0 :(得分:2)

改编自this MSDN article

UINT i, uSelectedCount = m_myListCtrl.GetSelectedCount();
int  nItem;
if (uSelectedCount > 0)
    for (i=0; i < uSelectedCount; i++)
    {   nItem = m_myListCtrl.GetNextItem(-1, LVNI_SELECTED);
        ASSERT(nItem != -1);
        m_myListCtrl.DeleteItem(nItem); 
    }

答案 1 :(得分:0)

当删除包含多个项目的多个选项时,我更喜欢这样做:

int nItem = -1;
while ((nItem = m_list.GetNextItem(nItem, LVNI_SELECTED)) != -1)
{
    if (m_list.DeleteItem(nItem))
        nItem--;
}

请注意重要的nItem--;

<强>更新

我不得不放弃这种方法,因为元素gots的ItemData搞砸了。如果我删除第n个元素,那么n + 1元素将是我的新元素。该元素完全搞砸了Itemdata。

更新2

我也试过

int nItem = -1;
while ((nItem = m_list.GetNextItem(-1, LVNI_SELECTED)) != -1)
{
    m_list.DeleteItem(nItem);
}

这种方法也存在拧紧我之前报道的Itemdata的问题。

答案 2 :(得分:0)

以下方法对我来说很完美:

std::stack< int > items;
int nItem = -1;

while ((nItem = myListCtrl.GetNextItem(nItem, LVNI_SELECTED)) != -1)
{
    items.push(nItem);
}

bool removed = false;
while (!items.empty())
{
    nItem = items.top();

    if (myListCtrl.DeleItem(nItem))
        removed = true;

    items.pop();
}

if (removed)
    // update some application state;

说明: 当你从头到尾删除东西时,你不必担心职位的有效性。由于CListCtrl不提供GetPrevItem或以其他方式以相反的顺序获取项目,因此您需要将它们存储在可以具有相反顺序的集合中。

最实用的方法是使用堆栈。由于它的工作方式,你会按正常顺序放置东西,当你检索东西时,它们会自动按相反的顺序排列。