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

如何在MFC中删除列表控件的选定行?,mfc,listcontrol,Mfc,Listcontrol,我想删除MFC中列表控件的选定行。 我已经创建了一个删除按钮,所以如果选择了任何行(可以是一行或多行),并且我按下了删除按钮,那么这些行应该被删除。 如果假设有100行,我从50-60中选择行,那么这个范围内的所有行都应该被删除,其余行的索引应该从1到90。也就是说,删除后索引应该是正确的 改编自: UINT i,uSelectedCount=m_myListCtrl.GetSelectedCount(); int nItem; 如果(uSelectedCount>0) 对于(i=0;i0) 对

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

改编自:

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))
删除=真;
项目