首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC序列化學生管理系統:使用CListView實現表頭顯示與數據綁定

     編輯:程式設計綜合問答

需求分析

基於MFC文檔/視圖架構,利用序列化機制持久化學生信息,界面需顯示表頭(姓名、性別、民族等)及數據列表。

核心實現步驟

1. 文檔類管理數據集合

// Student.h
class CStudent : public CObject {
    DECLARE_SERIAL(CStudent)
public:
    CString strName, strGender, strNation;
    int nAge;
    void Serialize(CArchive& ar) override {
        if (ar.IsStoring()) ar << strName << strGender << strNation << nAge;
        else ar >> strName >> strGender >> strNation >> nAge;
    }
};

// StudentDoc.h
class CStudentDoc : public CDocument {
    DECLARE_DYNCREATE(CStudentDoc)
protected:
    CObList m_studentList; // 序列化容器
public:
    CObList& GetList() { return m_studentList; }
    void Serialize(CArchive& ar) override { m_studentList.Serialize(ar); }
};

2. 視圖類使用 CListView(報表模式)

// StudentView.h
class CStudentView : public CListView {
    DECLARE_DYNCREATE(CStudentView)
protected:
    void OnInitialUpdate() override {
        CListView::OnInitialUpdate();
        CListCtrl& list = GetListCtrl();
        list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
        
        // 插入表頭
        list.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
        list.InsertColumn(1, _T("性別"), LVCFMT_CENTER, 60);
        list.InsertColumn(2, _T("民族"), LVCFMT_LEFT, 80);
        list.InsertColumn(3, _T("年齡"), LVCFMT_CENTER, 50);
    }
    
    void RefreshList() {
        CListCtrl& list = GetListCtrl();
        list.DeleteAllItems();
        CStudentDoc* pDoc = GetDocument();
        POSITION pos = pDoc->GetList().GetHeadPosition();
        int nItem = 0;
        while (pos) {
            CStudent* pStu = (CStudent*)pDoc->GetList().GetNext(pos);
            list.InsertItem(nItem, pStu->strName);
            list.SetItemText(nItem, 1, pStu->strGender);
            list.SetItemText(nItem, 2, pStu->strNation);
            list.SetItemText(nItem, 3, std::to_wstring(pStu->nAge).c_str());
            nItem++;
        }
    }
    
    void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) override {
        RefreshList(); // 文檔數據變更時自動刷新
    }
};

3. 序列化自動保存/加載

MFC框架在`File → Save/Open`時自動調用`CDocument::Serialize`,進而調用`CObList::Serialize`,再調用每個`CStudent::Serialize`,無需手寫文件讀寫代碼。

關鍵優勢

  • CListView + LVS_REPORT:原生支持表頭、列排序、全行選中、網格線
  • 文檔/視圖分離:數據邏輯在Doc,顯示邏輯在View,符合MFC架構
  • 序列化透明:`DECLARE_SERIAL`/`IMPLEMENT_SERIAL` 宏自動處理版本號、多態存儲

擴展建議

  • 右鍵菜單:新增、刪除、編輯學生(彈出對話框修改Doc數據,調用`UpdateAllViews`刷新)
  • 查找/過濾:工具欄編輯框 + `SetRedraw(FALSE)` 批量更新
  • 導出Excel:遍歷`CObList`寫入CSV或使用ODBC
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved