我想在MFC中删除列表控件的选定行。 我已经创建了一个删除按钮,所以如果选择任何行(可能是一行或多行),我按删除按钮/那些行应该被删除。 如果让我说有100行并且我从50-60中选择行,则应删除此范围内的所有行,其余行应具有1到90之间的索引。这意味着删除后索引也应该正确。
答案 0 :(得分:2)
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或以其他方式以相反的顺序获取项目,因此您需要将它们存储在可以具有相反顺序的集合中。
最实用的方法是使用堆栈。由于它的工作方式,你会按正常顺序放置东西,当你检索东西时,它们会自动按相反的顺序排列。