1. 程式人生 > >MFC GridControl 控制元件使用(1)

MFC GridControl 控制元件使用(1)

1.將該控制元件涉及的.cpp(6個)和.h(8個)檔案加入工程
2.從工具箱中拖入Custom Control,右擊該控制元件屬性,將Class項設定為MFCGridCtrl
3.在工程標頭檔案中,#include "GridCtrl.h",且定義變數CGridCtrl m_ctrlGrid;
4.在工程定義檔案中,在DoDataExchange函式,新增DDX_GridControl(pDX, IDC_CUSTOM1, m_ctrlGrid);(假設控制元件ID為IDC_CUSTOM1)
5.在需要用到表格控制元件的地方使用即可。譬如:m_ctrlGrid.SetRowCount(10);
 m_ctrlGrid.SetColumnCount(3);

具體步驟:

1、首先要使用MFCgridctrl 必須要在用到的系統中匯入gridctrl資料夾的全部cpp和h檔案(方法 project-->add to project -->files),這時候可以在類的試圖中看到CGridCtrl CCellID等等一些類
2、加入一個Custom Control,將Class設為: MFCGridCtrl 記住要 MFCGridCtrl 這個名字,原因是 該類用registerClass註冊了該類,Style等可以隨便設定

3、在使用類中,定義一個物件: CGridCtrl m_AttrGrid;注意一定要定義一個物件,否則該類如果是視窗類的話將用DoModal無法顯示

4、編譯時如果報錯,說找不到CGridCtrl,那麼在相應的定義物件的 .h內將GridCtrl.h包含進入 #include "路徑/GridCtrl.h"

5、在DoDataExchange(CDataExchange* pDX)函式中加入:
             DDX_GridControl(pDX, IDC_GRID/*第一步中可以看到的ID值*/, m_AttrGrid/*第三步中定義的物件名*/);

6、如果需要初始化該控制元件 可在使用的類中的 OnInitDialog 加相關函式
比如  
 m_AttrGrid.SetColumnCount(3);    // 設定總共的列數
 m_AttrGrid.SetRowCount(1)        // 設定總共的行數
 m_AttrGrid.SetFixedRowCount(1);  // 設定固定行數
 m_AttrGrid.SetItemText(0,0,"屬性"); // SetItemText 用來設定某行某列的具體文字數值
 m_AttrGrid.SetItemText(0,1,"標準值");
 m_AttrGrid.SetItemText(0,2,"當前值");
 // 可以通過
//  m_AttrGrid.SetItemState(i,0,GVIS_READONLY);
//  m_AttrGrid.SetItemState(i,1,GVIS_READONLY);
/// 來設定單元格是否只讀
 CRect GRect;
 m_AttrGrid.GetWindowRect(&GRect);               // 得到控制元件的寬度
 m_AttrGrid.SetColumnWidth(0,GRect.Width()/3-2); // 設定沒列的寬度
 m_AttrGrid.SetColumnWidth(1,GRect.Width()/3-2);
 m_AttrGrid.SetColumnWidth(2,GRect.Width()/3-2);

7、 對於最常見的一個功能,就是修改完畢後馬上驗證和儲存的方法可以參考如下
修改
CGridCtrl::OnEndEditCell 函式,在該函式中新增驗證函式比如
void CGridCtrl::OnEndEditCell(int nRow, int nCol, CString str)
{
    CString strCurrent = GetItemText(nRow, nCol);
 // self check
 str=CheckInputValid(nRow, nCol, str); // 你的驗證函式
 // 其中strCurrent為修改前的值,str為修改後的值
 .....
對於修改後資料的儲存,可以這麼做
先建立對映
 ON_NOTIFY(GVN_ENDLABELEDIT, IDC_ATTR_GRID, OnEndEditGrid)
然後在 //{{AFX_MSG(CXmlViewerDlg) 中建立
 afx_msg void OnEndEditGrid(NMHDR* pNMHDR, LRESULT* pResult);
OnEndEditGrid(NMHDR* pNMHDR, LRESULT* pResult) 中實現資料儲存操作
{
 NM_GRIDVIEW* pNmgv = (NM_GRIDVIEW*) pNMHDR;
 CCellID cii(pNmgv->iRow, pNmgv->iColumn);
 CString newValue=m_AttrGrid.GetItemText(cii.row,cii.col);
 // 這裡就得到了修改後的新值,可以在此進行操作了

}