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