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

基於 CGridCtrl 虛模式實作高效能 DBGrid

     編輯:關於VC++

動機與原理

微軟 DBGrid 功能弱、文件缺乏、介面不佳。Chris Maunder 的 CGridCtrl 支援虛模式:不實際儲存百萬列資料,僅在捲動時動態請求可視區域資料,極大提升大量資料顯示效能。

虛模式基本設定

m_Grid.SetVirtualMode(TRUE);
m_Grid.SetRowCount(nTotalRows);       // 總列數(查詢筆數)
m_Grid.SetFixedRowCount(1);           // 標題列
m_Grid.SetColumnCount(nCols);         // 欄位數
m_Grid.SetFixedColumnCount(1);        // 固定欄(如行號)

響應 GVN_GETDISPINFO 通知

在對話框 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);
}

資料來源:CRecordset 雙向游標 vs 記憶體映射檔

  • ClassWizard 產生的 CRecordset 支援 SetAbsolutePosition,可直接定位列,但需為每個查詢建立類別,不夠彈性。
  • 單獨使用 CRecordset 僅支援前向游標,無法隨機存取。
  • 本文方案:封裝 COdbcDBGRIDFILE 類別,使用記憶體映射檔快取查詢結果。啟動時僅讀取首頁資料,捲動時按需讀取後續資料,避免一次性載入大量資料導致延遲。

COdbcDBGRIDFILE 介面與使用步驟

// 建構子
COdbcDBGRIDFILE(CGridCtrl* pGrid, CDatabase* pDatabase, CString strSql, CString strFilePath);
int InitGrid();           // 初始化:建立映射檔、設定 Grid 屬性
int SetGridText(GV_DISPINFO* pDispInfo); // 由 OnNotify 呼叫,填入單元格資料
int Release();            // 釋放資源
  1. 專案加入 CGridCtrl 相關檔案與 OdbcDBGRIDFILE.h/cpp。
  2. 對話框放入 Custom Control,類別名 MFCGridCtrl,ID IDC_GRIDODBC,關聯變數 m_Grid。
  3. 加入資料庫連線變數 CDatabase m_db、指標 COdbcDBGRIDFILE* m_pMapFile。
  4. OnNotify 轉呼叫 m_pMapFile->SetGridText。
  5. 查詢按鈕:開啟資料庫、建立 COdbcDBGRIDFILE、呼叫 InitGrid。
  6. 關閉對話框時呼叫 Release 釋放映射檔與資料庫連線。
DBGrid 執行畫面

優點總結

  • 無需預先綁定,SQL 字串直接查詢。
  • 支援百萬列資料流暢捲動。
  • 封裝良好,介面簡潔(僅 4 個公用函式)。
  • 搭配 CMYODBC/CODBCSet 可進一步提升資料庫存取效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved