关于使用gridctrl

 
最近给公司写一个软件的同时用到了 MFCgridctrl 这个控件,现在就简要写一下心得
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_Grid/*第三步中定义的对象名*/);

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);
 // 这里就得到了修改后的新值,可以在此进行操作了

另外附上 gridctrl 的源文件

你可能感兴趣的:([VC/BCB])