首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

ADO 操作 Access 完整流程與 CListCtrl 進階應用:增刪改查、右鍵刪除、列選取同步

     編輯:關於VC++

專案功能

  • ADO 連接 Access,實作資料表完整 CRUD
  • CListCtrl 報表模式顯示資料
  • 左鍵選取列 → 編輯區填入資料
  • 右鍵雙擊列 → 刪除該筆記錄
  • 查詢過濾支援

介面截圖

程式介面

關鍵技術點

1. CListCtrl 初始化


m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE);
m_ListCtrl.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 50);
m_ListCtrl.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(2, _T("電話"), LVCFMT_LEFT, 120);
// ...

2. 資料填充


void RefreshList()
{
    m_ListCtrl.DeleteAllItems();
    _RecordsetPtr rs; rs.CreateInstance("ADODB.Recordset");
    rs->Open("SELECT * FROM Table1", m_pConnection.GetInterfacePtr(), adOpenStatic, adLockReadOnly, adCmdText);

    int nRow = 0;
    while (!rs->adoEOF) {
        CString strId = (LPCSTR)_bstr_t(rs->GetCollect("ID"));
        CString strName = (LPCSTR)_bstr_t(rs->GetCollect("Name"));
        CString strPhone = (LPCSTR)_bstr_t(rs->GetCollect("Phone"));

        m_ListCtrl.InsertItem(nRow, strId);
        m_ListCtrl.SetItemText(nRow, 1, strName);
        m_ListCtrl.SetItemText(nRow, 2, strPhone);
        // 將主鍵存入 lParam 便於後續操作
        m_ListCtrl.SetItemData(nRow, _ttoi(strId));
        ++nRow;
        rs->MoveNext();
    }
}

3. 左鍵選取同步編輯區


void OnNMClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMITEMACTIVATE* pNM = (NMITEMACTIVATE*)pNMHDR;
    if (pNM->iItem >= 0) {
        CString strId = m_ListCtrl.GetItemText(pNM->iItem, 0);
        CString strName = m_ListCtrl.GetItemText(pNM->iItem, 1);
        CString strPhone = m_ListCtrl.GetItemText(pNM->iItem, 2);
        m_editId.SetWindowText(strId);
        m_editName.SetWindowText(strName);
        m_editPhone.SetWindowText(strPhone);
    }
    *pResult = 0;
}

4. 右鍵雙擊刪除


void OnNMDblClkList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMITEMACTIVATE* pNM = (NMITEMACTIVATE*)pNMHDR;
    if (pNM->iItem >= 0) {
        if (AfxMessageBox(_T("確定刪除?"), MB_YESNO) == IDYES) {
            DWORD dwId = m_ListCtrl.GetItemData(pNM->iItem);
            _CommandPtr cmd; cmd.CreateInstance("ADODB.Command");
            cmd->ActiveConnection = m_pConnection;
            cmd->CommandText = "DELETE FROM Table1 WHERE ID = ?";
            cmd->Parameters->Append(cmd->CreateParameter(_T("ID"), adInteger, adParamInput, 4, dwId));
            cmd->Execute(NULL, NULL, adCmdText);
            RefreshList();
        }
    }
    *pResult = 0;
}

5. 新增/修改


// 新增
_RecordsetPtr rs; rs.CreateInstance("ADODB.Recordset");
rs->Open("SELECT * FROM Table1 WHERE 1=0", m_pConnection.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
rs->AddNew();
rs->PutCollect("Name", _variant_t(m_strName));
rs->PutCollect("Phone", _variant_t(m_strPhone));
rs->Update();

// 修改
rs->Open("SELECT * FROM Table1 WHERE ID = " + m_strId, ...);
rs->PutCollect("Name", _variant_t(m_strName));
rs->PutCollect("Phone", _variant_t(m_strPhone));
rs->Update();

原始碼下載

完整 Dialog 專案,含 ADO 連線管理類、錯誤處理、資料驗證與詳細註解。

本文配套源碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved