我写的这个函数的作用是,首先添加了销售药品,到ClistCtrl列表中,然后想用鼠标选中,删除,删除后,不仅列表中的没了,药品销售数据库中与此对应的记录了要删除。现在删除数据库中对应的记录不知道怎么删,因为不知道怎么才能删除自己用鼠标选择的那一行。这是  删除   按钮关联的函数。
void CSaleDlg::OnDelete() 
{
UpdateData();
CManageMedic manageMedic;
CSale* oldSale=new CSale;

CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_LIST1);
ASSERT(pListCtrl != NULL);
POSITION pos = pListCtrl->GetFirstSelectedItemPosition();
if (pos == NULL)
{
AfxMessageBox("请选择要删除的药品!");
return;
}
else
{
oldSale->m_MedicineID=theSaleSet->m_MedicineID;
oldSale->m_MedicineName=theSaleSet->m_MedicineName;
oldSale->m_MedicineNumber=theSaleSet->m_MedicineNumber;
oldSale->m_MedicinePrice=theSaleSet->m_MedicinePrice;
oldSale->m_SaleData=theSaleSet->m_SaleData;
manageMedic.SetSale(oldSale);
manageMedic.SetSaleSet(theSaleSet);
manageMedic.SetMedicSet(theMedicSet);
if(manageMedic.DeleteFromSaleTable()) //关键在这里,不会写
{
m_saleList.DeleteAllItems();
theSaleSet->m_strFilter="";
theSaleSet->Requery();
for(int i=0;;i++)
{
if(theSaleSet->IsEOF())
{
break;
}
CString str;
str.Format("%d",theSaleSet->m_MedicineNumber);
m_saleList.InsertItem(i,theSaleSet->m_MedicineID);
m_saleList.SetItemText(i,1,theSaleSet->m_MedicineName);
m_saleList.SetItemText(i,2,str);
    str.Format("%f",theSaleSet->m_MedicinePrice);
m_saleList.SetItemText(i,3,str);
str=nowTime.Format("%Y-%m-%d %H:%M:%S");
m_saleList.SetItemText(i,4,str);
theSaleSet->MoveNext();
}
}
}
m_name="";
m_number=0;
UpdateData(FALSE);
}
BOOL CManageMedic::DeleteFromSaleTable()
{
 /*
   这里不会写,不知道怎么才能使得删除的是用鼠标选中的项。
   */
m_theSaleSet->m_strFilter="MedicineID='"+m_theSaleSet->m_MedicineID+"'";
m_theSaleSet->Requery();
m_theSaleSet->Delete();
if(m_theSaleSet->CanUpdate())
{
m_theSaleSet->Update();
}
return TRUE;
}

解决方案 »

  1.   

    GetFirstSelectedItemPosition
    GetItemText
      

  2.   

    可以返回一个选中的行号,应该是返回一个iItem的int值,具体我也不大记得了,你查查吧
      

  3.   

    CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
    ASSERT(pListCtrl != NULL);POSITION pos = pList->GetFirstSelectedItemPosition();
    if (pos == NULL)
       TRACE0("No items were selected!\n");
    else
    {
       while (pos)
       {
          int nItem = pList->GetNextSelectedItem(pos);
          TRACE1("Item %d was selected!\n", nItem);
          // you could do your own processing on nItem here
       }
    }
    上面的代码是实现你点击的那行的位置,然后你可以把得到的nItem加上你想要得到的数据基于0的索引传给
    GetItemText这个函数,得到一个字段,然后你就可以通过这个字段写出sql 语句,执行删除操作就行了。
      

  4.   

    从数据库读取或添加数据的时候,将主键记录到一个列表中,删除的时候从列表中获取,执行对应的SQL语句就可以了
    --------------------
    还有一种简便的办法:将记录对应的主键写到listctrl中,把该列长读设为0,删除的时候从该列中获取主键,执行对应的SQL语句就可以了
      

  5.   

    void CSaleDlg::OnDelete() 
    {
    //建立一个指针,用以操作ListCtrl输出用户记录
    CListCtrl *ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
    //寻找当前选中的记录的位置
    POSITION pos = ctl->GetFirstSelectedItemPosition();
    if(pos == NULL)
    {
    //如果没有选择记录,则提示并退出
    AfxMessageBox("请先选中一条销售记录!");
    return;
    }
    else
    { //获取当前记录的位置游标
        int m_CurUser=ctl->GetNextSelectedItem(pos);
    //创建一个临时字条串来保存当前用户信
    char charTemp[20];

        //取得用户ID
         ctl->GetItemText(m_CurUser,0,charTemp,sizeof(charTemp[20]));
        //将用户ID转换为整数保存,后面的数据库将以此为匹配条件
     //    int m_CurUserID = atoi(charTemp);
            if(theSaleSet->IsOpen())
    {
    theSaleSet->Close();
    }
    theSaleSet->m_strFilter="MedicineID='"+m_CurUser+"'";//这行提示错误信息
        //error C2110: cannot add two pointers
    theSaleSet->Requery();
    theSaleSet->Delete();
            
    m_saleList.DeleteAllItems();
    theSaleSet->m_strFilter="";
    theSaleSet->Requery();
    for(int i;;i++)
    {
    if(!theSaleSet->IsEOF())
    {
    break;
    }
    CString str;
    str.Format("%d",theSaleSet->m_MedicineNumber);
    m_saleList.InsertItem(i,theSaleSet->m_MedicineID);
    m_saleList.SetItemText(i,1,theSaleSet->m_MedicineName);
    m_saleList.SetItemText(i,2,str);
    str.Format("%f",theSaleSet->m_MedicinePrice);
    m_saleList.SetItemText(i,3,str);
    str=nowTime.Format("%Y-%m-%d %H:%M:%S");
    m_saleList.SetItemText(i,4,str);
    theSaleSet->MoveNext();
    }

    AfxMessageBox("删除成功!");
    }
    }
    但提示有错误信息,我猜是我在access中定义MedicineID是文本类型,但这里是字符类型,所以匹配不了。因为MedicineID我希望能包含字母和数字,比如  D3  。现在我该怎么改呢!用GetItemText获取的ID是什么类型呢!
      

  6.   

    void CSaleDlg::OnDelete() 
    {
    //建立一个指针,用以操作ListCtrl输出用户记录
    CListCtrl *ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
    //寻找当前选中的记录的位置
    POSITION pos = ctl->GetFirstSelectedItemPosition();
    if(pos == NULL)
    {
    //如果没有选择记录,则提示并退出
    AfxMessageBox("请先选中一条销售记录!");
    return;
    }
    else
    { //获取当前记录的位置游标
        int m_CurUser=ctl->GetNextSelectedItem(pos);
        //取得用户ID
            CString m_CurUserID =ctl->GetItemText(m_CurUser,0);
            if(theSaleSet->IsOpen())
    {
    theSaleSet->Close();
    }
    theSaleSet->m_strFilter="MedicineID='"+m_CurUserID+"'";
    theSaleSet->Requery();
    theSaleSet->Delete();
            
    m_saleList.DeleteAllItems();
    theSaleSet->m_strFilter="";
    theSaleSet->Requery();
    for(int i;;i++)
    {
    if(!theSaleSet->IsEOF())
    {
    break;
    }
    CString str;
    str.Format("%d",theSaleSet->m_MedicineNumber);
    m_saleList.InsertItem(i,theSaleSet->m_MedicineID);
    m_saleList.SetItemText(i,1,theSaleSet->m_MedicineName);
    m_saleList.SetItemText(i,2,str);
    str.Format("%f",theSaleSet->m_MedicinePrice);
    m_saleList.SetItemText(i,3,str);
    str=nowTime.Format("%Y-%m-%d %H:%M:%S");
    m_saleList.SetItemText(i,4,str);
    theSaleSet->MoveNext();
    }

    AfxMessageBox("删除成功!");
    }
    改成这样后提示内容不能读!