0

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

4

3 回答 3

3

改编自这篇 MSDN 文章

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); 
    }
于 2013-12-30T12:45:55.987 回答
0

删除具有多个项目的多项选择时,我更喜欢这样做:

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

注意重要的nItem--;

更新

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

更新 2

我也试过

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

这种做法也有把我之前报道的Itemdata搞砸的问题。

于 2015-06-16T10:14:47.537 回答
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 或任何其他方式以反向顺序获取项目,因此您需要将它们存储在可以具有反向顺序的集合中。

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

于 2015-06-26T22:34:17.430 回答