微軟 DBGrid 功能弱、文件缺乏、介面不佳。Chris Maunder 的 CGridCtrl 支援虛模式:不實際儲存百萬列資料,僅在捲動時動態請求可視區域資料,極大提升大量資料顯示效能。
m_Grid.SetVirtualMode(TRUE);
m_Grid.SetRowCount(nTotalRows); // 總列數(查詢筆數)
m_Grid.SetFixedRowCount(1); // 標題列
m_Grid.SetColumnCount(nCols); // 欄位數
m_Grid.SetFixedColumnCount(1); // 固定欄(如行號)
在對話框 OnNotify 中處理:
BOOL CMyOdbcDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) {
if (wParam == m_Grid.GetDlgCtrlID()) {
GV_DISPINFO* pDispInfo = (GV_DISPINFO*)lParam;
if (pDispInfo->hdr.code == GVN_GETDISPINFO) {
SetGridItem(pDispInfo); // 自訂函式填入單元格文字
*pResult = 1; return TRUE;
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
void CMyOdbcDlg::SetGridItem(GV_DISPINFO* pDispInfo) {
// pDispInfo->item.row / .col 為目前需顯示的座標
pDispInfo->item.strText.Format(_T("row%d,col%d"), pDispInfo->item.row, pDispInfo->item.col);
}
SetAbsolutePosition,可直接定位列,但需為每個查詢建立類別,不夠彈性。COdbcDBGRIDFILE 類別,使用記憶體映射檔快取查詢結果。啟動時僅讀取首頁資料,捲動時按需讀取後續資料,避免一次性載入大量資料導致延遲。// 建構子
COdbcDBGRIDFILE(CGridCtrl* pGrid, CDatabase* pDatabase, CString strSql, CString strFilePath);
int InitGrid(); // 初始化:建立映射檔、設定 Grid 屬性
int SetGridText(GV_DISPINFO* pDispInfo); // 由 OnNotify 呼叫,填入單元格資料
int Release(); // 釋放資源
CGridCtrl 相關檔案與 OdbcDBGRIDFILE.h/cpp。MFCGridCtrl,ID IDC_GRIDODBC,關聯變數 m_Grid。CDatabase m_db、指標 COdbcDBGRIDFILE* m_pMapFile。OnNotify 轉呼叫 m_pMapFile->SetGridText。COdbcDBGRIDFILE、呼叫 InitGrid。Release 釋放映射檔與資料庫連線。
CMYODBC/CODBCSet 可進一步提升資料庫存取效能。