利用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);
}
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);
}
因为说的不清楚,我有2个猜测.第一种可能是你要的结果
1.你list启用了排序,所以你得到的pos和从数据库中的数据位置不一致.导致删除错误
2.你删除后,list没有刷新.导致被删除掉的数据还占有一定的位置.所以2次pos不一致.导致错误
#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);
}
m_grid.DeleteAllItems();//删除所以记录
AddToGrid();//重新遍历记录集
所以List肯定是刷新了。至于排序问题,我把排序去掉了,一样不行。而且我觉得并不是排序问题,我在另一个程序里也用了排序,删除的时候就可以点哪个删哪个……
可能真的是排序的问题,不过我把排序语句去掉了,List控件还是按照排序的顺序排列。
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);
//}
}