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);
// ...
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();
}
}
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;
}
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;
}
// 新增
_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 連線管理類、錯誤處理、資料驗證與詳細註解。