如何在MFC中删除列表控件的选定行?
我想删除MFC中列表控件的选定行。 我已经创建了一个删除按钮,所以如果选择了任何行(可以是一行或多行),并且我按下了删除按钮,那么这些行应该被删除。 如果假设有100行,我从50-60中选择行,那么这个范围内的所有行都应该被删除,其余行的索引应该从1到90。也就是说,删除后索引应该是正确的 改编自:如何在MFC中删除列表控件的选定行?,mfc,listcontrol,Mfc,Listcontrol,我想删除MFC中列表控件的选定行。 我已经创建了一个删除按钮,所以如果选择了任何行(可以是一行或多行),并且我按下了删除按钮,那么这些行应该被删除。 如果假设有100行,我从50-60中选择行,那么这个范围内的所有行都应该被删除,其余行的索引应该从1到90。也就是说,删除后索引应该是正确的 改编自: UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount(); int nItem; 如果(uSelectedCount>0) 对于(i=0;i0) 对
UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount();
int nItem;
如果(uSelectedCount>0)
对于(i=0;i
改编自:
UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount();
int nItem;
如果(uSelectedCount>0)
对于(i=0;i
改编自:
UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount();
int nItem;
如果(uSelectedCount>0)
对于(i=0;i
改编自:
UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount();
int nItem;
如果(uSelectedCount>0)
对于(i=0;i
删除包含多个项目的多项选择时,我更喜欢这样做:
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会出错。当删除包含多个项目的多个选择时,我更喜欢这样做:
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会出错。当删除包含多个项目的多个选择时,我更喜欢这样做:
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会出错。当删除包含多个项目的多个选择时,我更喜欢这样做:
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的问题。以下方法对我非常有效:
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;
std::stack项;
int nItem=-1;
而((nItem=myListCtrl.GetNextItem(nItem,LVNI_选中))!=-1)
{
项目。推送(nItem);
}
bool-removed=false;
而(!items.empty())
{
nItem=items.top();
if(myListCtrl.DeleItem(nItem))
删除=真;
items.pop();
}
如果(已删除)
//更新一些应用程序状态;
说明:
当你把事情从头到尾处理掉时,你不必担心职位的有效性。由于CListCtrl不提供GetPrevItem或任何其他方式来以相反顺序获取项目,因此需要将它们存储在一个集合中,在该集合中可以以相反顺序获取项目
最实用的方法是使用堆栈。由于它的工作方式,您将按正常顺序将东西放在那里,当您检索东西时,它们会自动按相反顺序排列。以下方法对我非常有效:
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;
std::stack项;
int nItem=-1;
而((nItem=myListCtrl.GetNextItem(nItem,LVNI_选中))!=-1)
{
项目。推送(nItem);
}
bool-removed=false;
而(!items.empty())
{
nItem=items.top();
if(myListCtrl.DeleItem(nItem))
删除=真;
items.pop();
}
如果(已删除)
//更新一些应用程序状态;
说明:
当你把事情从头到尾处理掉时,你不必担心职位的有效性。由于CListCtrl不提供GetPrevItem或任何其他方式来以相反顺序获取项目,因此需要将它们存储在一个集合中,在该集合中可以以相反顺序获取项目
最实用的方法是使用堆栈。由于它的工作方式,您将按正常顺序将东西放在那里,当您检索东西时,它们会自动按相反顺序排列。以下方法对我非常有效:
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;
std::stack项;
int nItem=-1;
而((nItem=myListCtrl.GetNextItem(nItem,LVNI_选中))!=-1)
{
项目。推送(nItem);
}
bool-removed=false;
而(!items.empty())
{
nItem=items.top();
if(myListCtrl.DeleItem(nItem))
删除=真;
项目