利用List Control控件删除数据时,鼠标点击某行数据时,该行高亮显示,点击“删除”按钮,该行记录被删除。但是我做的程序为什么总是删错呢?我点这个,它删那个,只有就剩下最后一条记录时,才是正确的删除。请高手指教这是为什么?
void CUserinfoDlg::OnDelete() 
{
// TODO: Add your control notification handler code here
UpdateData(true);
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t sql;
sql = "select * from users";
_RecordsetPtr m_pRecordset;
    m_pRecordset=m_AdoConn.GetRecordset(sql);
     try
{
m_pRecordset->Move(pos,vtMissing);//(pos=m_grid.GetSelectionMark();)
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
m_AdoConn.ExitConnect();
}
catch(...)
{
MessageBox("操作失败");
return;
}

MessageBox("删除成功!");
m_grid.DeleteAllItems();
AddToGrid();
m_pwd="";
m_name="";
m_combo1="";
UpdateData(FALSE);
}

解决方案 »

  1.   

    pos 没有找到这个哪里赋值的.
    因为说的不清楚,我有2个猜测.第一种可能是你要的结果
    1.你list启用了排序,所以你得到的pos和从数据库中的数据位置不一致.导致删除错误
    2.你删除后,list没有刷新.导致被删除掉的数据还占有一定的位置.所以2次pos不一致.导致错误
      

  2.   


    #include <vector>
    using namespace std;vector<int> vec;
    POSITION pos = m_list.GetFirstSelectedItemPosition(); int nIndex = -1;
    while(pos)
    {
    nIndex = m_list.GetNextSelectedItem(pos);
    vec.push_back(nIndex);
    } // Delete
    for(vector<int>::reverse_iterator iter = vec.rbegin(); iter != vec.rend(); iter++)
    {
    m_list.DeleteItem(*iter);
    }
      

  3.   

    我估计是你的listctrl 有sort属性, 先去掉再删除看看有什么问题。
      

  4.   

    MessageBox("删除成功!");
    m_grid.DeleteAllItems();//删除所以记录
    AddToGrid();//重新遍历记录集
    所以List肯定是刷新了。至于排序问题,我把排序去掉了,一样不行。而且我觉得并不是排序问题,我在另一个程序里也用了排序,删除的时候就可以点哪个删哪个……
      

  5.   

    1.你list启用了排序,所以你得到的pos和从数据库中的数据位置不一致.导致删除错误
    可能真的是排序的问题,不过我把排序语句去掉了,List控件还是按照排序的顺序排列。
      

  6.   

    pos位置是不是错了一位?这点索引可能有问题
      

  7.   

    pos的作用只是告诉程序在ListControl控件的第几列插入数据,跟排列没有关系
    pos=m_grid.GetSelectionMark();删除代码如下:
    void CUserinfoDlg::OnDelete() 
    {
    // TODO: Add your control notification handler code here

    UpdateData(true);
    ADOConn m_AdoConn;
    m_AdoConn.OnInitADOConn();
    _bstr_t sql;
    sql = "select * from users";
    _RecordsetPtr m_pRecordset;
        m_pRecordset=m_AdoConn.GetRecordset(sql);
        /*if("+m_combo+"==0)
    {
    MessageBox("管理员不能删除!");
    return;
    }
    else
    {*/
        try
    {
    m_pRecordset->Move(pos,vtMissing);
    m_pRecordset->Delete(adAffectCurrent);//删除当前行记录
    m_pRecordset->Update();
    m_AdoConn.ExitConnect();
    }
    catch(...)
    {
    MessageBox("操作失败");
    return;
    }

    MessageBox("删除成功!");
    m_grid.DeleteAllItems();
    AddToGrid();
    m_pwd="";
    m_name="";
    m_power="";
    UpdateData(FALSE);
    //}
    }