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

VC++ 操作 SQL Server 主從表:分割視窗、多視圖通訊與列表控件實戰

     編輯:關於SqlServer

一、視窗分割架構設計

動態 vs 靜態分割

CSplitterWnd 佔據框架視窗客戶區,視圖佔據分割窗格。兩種模式各有適用場景:

  • 動態分割: 使用單一視圖類,使用者可透過選單或拖曳分割框隨時分割/合併。適合簡單文檔編輯器。
  • 靜態分割: 建立時固定窗格數量與視圖類,支援多視圖類,各窗格擁有獨立捲軸。本文採用靜態分割實現主從表三視圖佈局。

巢狀分割器實作碼

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    CRect rect; GetClientRect(&rect);
    // 第一層:左右分割(1列2行)
    m_wndSplitter1.CreateStatic(this, 1, 2);
    m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CClassTreeView), CSize(150, 150), pContext);
    // 第二層:右側再上下分割(2列1行)
    m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE,
                                m_wndSplitter1.IdFromRowCol(0, 1));
    m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CDagView), CSize(0, 0), pContext);
    m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CDagDetailView), CSize(0, 0), pContext);
    m_wndSplitter2.SetRowInfo(0, rect.Height() / 2, 0);
    return TRUE; // 切記不可呼叫基類 OnCreateClient
}

關鍵點:CreateStatic 參數為 (parent, rows, cols);巢狀分割器的 parent 為上層分割器,且需透過 IdFromRowCol 取得窗格 ID。

二、多視圖間通訊:透過主框架取得視圖指標

本專案單一 Document,多視圖類獨立,採「主框架→分割器→窗格」路徑取得視圖指標:

CMainFrame* pFrame = static_cast(AfxGetMainWnd());
CDagDetailView* pDetailView = static_cast(
    pFrame->m_wndSplitter2.GetPane(1, 0)); // 第 1 列第 0 行
// 取得指標後即可呼叫視圖公用方法、存取資料成員

最佳實踐: 使用 static_cast 而非 C 風格強轉,編譯期即可檢查型別安全。

三、列表視圖控件深度應用

核心風格與訊息處理

  • 報表模式: LVS_REPORT 呈現類 DataGrid 列表,需搭配 SetWindowLong(GWL_STYLE, ...) 設定擴充風格(LVS_EX_FULLROWSELECT、LVS_EX_GRIDLINES 等)。
  • 關鍵通知訊息:
    • NM_CLICK:單擊項目
    • LVN_ITEMCHANGED:選取狀態變更(含鍵盤導航)
    • NM_DBLCLK:雙擊編輯/鑽取

選取變更事件處理範例

void CDagView::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    if ((pNMListView->uChanged & LVIF_STATE) &&
        (pNMListView->uNewState & LVIS_SELECTED))
    {
        int nItem = pNMListView->iItem;
        // 取得項目資料(如主鍵 ID),通知從表視圖重新查詢
        CString strKey = GetItemText(nItem, 0);
        NotifyDetailViewRefresh(strKey);
    }
    *pResult = 0;
}

四、主從表資料同步策略

  1. 主表視圖 選取變更 → 發送自訂訊息或直接呼叫從表視圖 RefreshData(LPCTSTR szMasterKey)
  2. 從表視圖 內部執行參數化查詢:
    SELECT * FROM DetailTable WHERE MasterID = ?
  3. 效能優化: 使用 CRecordset::Requery() 而非重新 Open;必要時在從表資料量大時啟用分頁或虛擬模式。

結語

靜態巢狀分割器構建穩定的三視圖佈局,主框架轉發指標實現鬆耦合通訊,列表控件配合 LVN_ITEMCHANGED 完成主從聯動。此架構清晰、可維護,適合 MFC 應用中常見的主從表管理介面。

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