如图 当点击添加按钮添加一些信息后,现在想多行删除,代码如下:
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
if (!pList->GetSelectedCount())
{
AfxMessageBox(_T("请选择一行再删除"));
return;
}
POSITION pos = pList->GetFirstSelectedItemPosition();
while (pos)
{
int nSel = pList->GetNextSelectedItem(pos);
CString str = pList->GetItemText(nSel, 0);
if (IDNO == AfxMessageBox(_T("确定要删除") + str + _T("的信息吗?"), MB_YESNO))
continue;
pList->DeleteItem(nSel);
}这里工号定义的是int型当选中多项后,选择删除,出现问题:删除了没有选中的项。经过分析发现当删除第一项后,pos指向下一个位置,但此时第一个选中的已经被删除,导致pos指向位置发生错位,第二个删除的已不是本应该删除的,导致删除问题。这个应该怎么解决呢?谢谢大家解答。

解决方案 »

  1.   

    经过思考发现实际上是因为删除前边的行导致pos指向出现问题,所以只要让pos指向当前实际的位置即可
    修改代码如下
    CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    if (!pList->GetSelectedCount())
    {
    AfxMessageBox(_T("请选择一行再删除"));
    return;
    }
    POSITION pos = pList->GetFirstSelectedItemPosition();
    while (pos)
    {
    int nSel = pList->GetNextSelectedItem(pos);
    CString str = pList->GetItemText(nSel, 0);
    if (IDNO == AfxMessageBox(_T("确定要删除") + str + _T("的信息吗?"), MB_YESNO))
    continue;
    pList->DeleteItem(nSel);
    pos = pList->GetFirstSelectedItemPosition(); }
      

  2.   

    pos = pList->GetFirstSelectedItemPosition(); 好
      

  3.   

    代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
    提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。