MFC grid control如何关联表格数据

katucha 2009-07-30 09:58:23
在大家的指点下,已经可以正确显示了,现在的问题是这样的:

因为我已经把MFC grid control控件里面的表格数据关联到一个2维数组了,所以我想在MFC grid control控件里面修改表格数据的同时,也会修改这个2维数组,那么我怎么写响应函数呢。

谢谢
...全文
609 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
katucha 2009-08-01
  • 打赏
  • 举报
回复
这下明白了
写的太清楚了
帮了大忙了
感谢
codelast.com 2009-07-31
  • 打赏
  • 举报
回复
我想你是真的搞错了,EndEdit函数的使用,不是让你直接在那个控件的源码里改它的函数,而是在你的对话框类中添加!

多打点字,就跟你详细说一下吧!

假设你的对话框类名为 CMyDlg,该类对应磁盘上的文件为 MyDlg.cpp和MyDlg.h ,则:

(1)你应该在 MyDlg.h 中添加函数:

afx_msg void OnGridEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult);

(2)在 MyDlg.cpp 中的 “BEGIN_MESSAGE_MAP()”和“END_MESSAGE_MAP()” 两行的中间添加:

ON_NOTIFY(GVN_ENDLABELEDIT, IDC_GRID, OnGridEndEdit)

其中,IDC_GRID 是你的Grid控件的ID。
(3)在 MyDlg.cpp 中编写函数 OnGridEndEdit 的实现:

void CMyDlg::OnGridEndEdit (NMHDR *pNotifyStruct, LRESULT* pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*)pNotifyStruct;

int nClickedRow = pItem->iRow; // 点击的行数
int nClickedCol = pItem->iColumn; // 点击的列数

// 下面处理单元格(nClickedRow, nClickedCol)的数据
// ......
}

(4)这样,你的这个函数就是在你的对话框类里了,你想使用对话框类的成员变量,还有何不可?

这下明白了不?
katucha 2009-07-31
  • 打赏
  • 举报
回复
估计我概念没搞清
katucha 2009-07-31
  • 打赏
  • 举报
回复
上网搜了一下,好像也可以这样做:

从grid control里面得到父窗口(也就是那个对话框类)的指针,再使用它的成员。

因此我在OnEndEditCell函数里面这么写

CWnd *p = this->GetParent();
float aa = p->table[1].Data[1][1];

不过提示说 error C2039: 'table' : is not a member of 'CWnd'

把Table table[MaxTable+1];设成public也一样有错

katucha 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 learnhard 的回复:]
首先,你说的“table”是什么东西?
其次,不管table是什么,既然你的Grid和它是在同一个对话框类里,同类中的变量为什么不可以互相访问?
[/Quote]

哎,可能问题太丢人了。

是这样:
table是一个自定义的结构体,我把一个table的数组定义为这个对话框类(CTablePanel)的一个私有变量,而grid control这个控件是这个对话框的一个公开变量,参见如下

// Construction
public:
CTablePanel(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CRASTablePanel)
enum { IDD = IDD_RAS_TablePanel_DIALOG };
CListCtrl m_list;
CGridCtrl grid;
//}}AFX_DATA

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CRASTablePanel)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation

private:
// Table variables
Table table[MaxTable+1];
int totaltable;

所以在void CGridCtrl::OnEndEditCell(int nRow, int nCol, CString str)函数里面就不能用到table这个数组了。

是不是要在grid control这个控件生成的时候,就把table带入这个控件里面呢?



codelast.com 2009-07-30
  • 打赏
  • 举报
回复
首先,你说的“table”是什么东西?
其次,不管table是什么,既然你的Grid和它是在同一个对话框类里,同类中的变量为什么不可以互相访问?
katucha 2009-07-30
  • 打赏
  • 举报
回复
谢谢,找到了。
是void CGridCtrl::OnEndEditCell(int nRow, int nCol, CString str)这个函数,
可是我的table不是在这个类里面定义的,是在一个对话框类里面定义的,这个对话框也包括了这个grid control控件,那我怎么操作呢?在OnEndEditCell函数里面使用table的数据么?
codelast.com 2009-07-30
  • 打赏
  • 举报
回复
用的是 MFC Grid Control 2.26 吗?看它的文档,在编辑完单元格的内容后,会触发一个消息响应函数的,大概是个类似于OnEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult) 之类的函数,在该函数里,可以获取你点击的行和列,也就对应了你的二维数组:

OnEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*)pNotifyStruct;

int nClickedRow = pItem->iRow; // 点击的行数
int nClickedCol = pItem->iColumn; // 点击的列数

// 下面处理单元格(nClickedRow, nClickedCol)的数据
// ......
}

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧