MFC中如何调用子对话框的DoDataExchange方法?
MFC嵌入对话框DoDataExchange调用问题解决
方案1:通过UpdateData间接触发
DoDataExchange是受保护成员,无法直接从外部调用,但你可以调用子对话框的UpdateData()方法,它内部会自动触发DoDataExchange完成数据交换:
// 保存子对话框控件数据到成员变量时传TRUE m_dlg1.UpdateData(TRUE); m_dlg2.UpdateData(TRUE); m_dlg3.UpdateData(TRUE); // 将成员变量数据加载到控件时传FALSE // m_dlg1.UpdateData(FALSE);
方案2:给子对话框加公开包装函数
在子对话框类中新增一个public成员函数,作为DoDataExchange的公开入口:
// 子对话框头文件 class CYourSubDlg : public CDialogEx { // ... 其他代码 public: void TriggerDataExchange(CDataExchange* pDX); }; // 子对话框cpp文件 void CYourSubDlg::TriggerDataExchange(CDataExchange* pDX) { this->DoDataExchange(pDX); }
之后在父对话框的DoDataExchange里直接调用这个公开函数:
void CMFCApplication3Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, m_ctlTab1); m_dlg1.TriggerDataExchange(pDX); m_dlg2.TriggerDataExchange(pDX); m_dlg3.TriggerDataExchange(pDX); }
方案3:关联子对话框控件
如果还未关联父对话框与子对话框对象,用DDX_Control完成关联后,父对话框的数据交换流程会自动联动子对话框:
void CMFCApplication3Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, m_ctlTab1); // 替换为你的子对话框资源ID DDX_Control(pDX, IDD_SUB_DLG_1, m_dlg1); DDX_Control(pDX, IDD_SUB_DLG_2, m_dlg2); DDX_Control(pDX, IDD_SUB_DLG_3, m_dlg3); }
注意要确保子对话框已经正确创建并嵌入到父对话框的Tab控件中。
提问来源于Stack Exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

