UpdateData 工作,然后数据更改?

Posted

技术标签:

【中文标题】UpdateData 工作,然后数据更改?【英文标题】:UpdateData works, then data changes? 【发布时间】:2011-07-06 14:04:03 【问题描述】:

语言: C++

开发环境: Microsoft Visual C++

使用的库: MFC

背景:所以我创建了一个应用程序,它基本上是一个大型首选项对话框,用户可以在其中配置多个页面,每个页面都有一堆不同的设置。用户完成后,他/她有三个选项用于保存首选项(以 XML 格式):Save Current [page]、Save TheseSave All

我现在正在使用保存这些功能。当用户选择此选项时,会出现一个对话框,其中包含每个页面的复选框,允许他们选择他们希望输出的页面。一旦他们选择了他们希望文件保存到的目录,奇迹就会发生并写入 XML 文件。

问题:我有一个函数 (UpdatePageData),它将检测正在显示的页面并通过调用 UpdateData 更新当前页面的数据.我已经设置了一个断点来观察以确保变量被用户输入的值填充,并且一切都很好并且工作正常。但是,当程序从复选框对话框(我在其中调用 UpdatePageData)跳转到我正在保存的页面的类时,突然所有值都错误。

下面我包含了一些代码,可以帮助你们理解程序流程。

注意:在 SaveThese 中,我目前只保存一个页面...一旦我发现我遇到的问题,我将让它更新所有选择的页面。


位置:主对话框

void CSAPrefsDialog::OnSaveThese()
  
  int msgboxID = ::MessageBox(
      NULL,
      (LPCSTR)"Are you sure you want to save?",
      (LPCSTR)"Save These",
      MB_ICONQUESTION | MB_OKCANCEL
  );

  switch (msgboxID)
  
      case IDCANCEL:
          break;
      case IDOK:
          UpdatePageData();
          CSaveThese m_sT;
          m_sT.DoModal();
          break;
  

位置:主对话框

void CSAPrefsDialog::UpdatePageData() 

  if ((m_iCurPage >= 0) && (m_iCurPage < m_pages.GetSize()))
  
      pageStruct *pPS = (pageStruct *)m_pages.GetAt(m_iCurPage);
      if (pPS)
      
          ASSERT(pPS->pDlg);
          if (pPS->pDlg)
          
              if (!pPS->pDlg->UpdateData()) // THIS WORKS. THE DATA IS UPDATED.
                
                  AfxMessageBox("Did not update data.");
              
          
      
  

位置:保存这些类

void CSaveThese::OnBnClickedOk()

  // TODO: Add your control notification handler code here
  UpdateData(TRUE); // figures out which boxes are checked for saving
  CDirDialog dir;
  CSAPrefsDialog prefsDialog;
  if(dir.DoBrowse())
  
      prefsDialog.m_strDirectorySavePath = dir.m_strPath;
  

      // [ other if-statements like the one below to check the check boxes ]

  
  if(m_bST_FS)
  
      FSC_Main m_FS;
      m_FS.Save(prefsDialog.m_strDirectorySavePath);
  
  OnOK();

位置:FSC_Main 类

void FSC_Main::Save(CString dirPath)

  if(Validate())
  
      dirPath += "\\FS_Config.xml";
      FILE *fp = fopen(dirPath, "w+");
      WriteXML(fp);
      fclose(fp);
  


当它到达 WriteXML 时,这些值要么恢复到它们的初始值(空字符串,所有组合框为 -1),要么具有奇怪的值(字符串为空,并且组合框的大数字)。

我想我只是在错误的地方放了一些东西。我只是不确定为什么会发生这种情况,这确实是我和真正让这个项目顺利进行之间的最大障碍。

【问题讨论】:

在 UpdateData 中放一个断点,看看它是否在 WriteXML 之前被调用,以及调用来自哪里。 UpdateData 在哪里?这是一个 MFC 函数...不知道如何在其中放置断点。 MFC 源代码随编译器一起提供,因此您应该能够在 CDialog::UpdateData 中设置断点。将断点放在 DoDataExchange 函数中可能更容易。 【参考方案1】:

乔恩,很难理解你的代码。我的理解是您在 CSAPrefsDialog 对话框类中有一个成员变量 m_pages,您正在通过调用 UpdateData 对其进行更新。然后您将创建一个局部变量 CSaveThese m_sT 并调用 DoModal。你认为 CSaveThese 类应该保存 m_Pages 的值吗?

【讨论】:

m_pages 是一个 CPtrArray。 CSaveThese 类不保存这些值。这是一个带有复选框的对话框,允许用户从主对话框中选择他们希望保存的页面。 那么哪个对象没有保留该值以及您在哪个类中检查这些值?

以上是关于UpdateData 工作,然后数据更改?的主要内容,如果未能解决你的问题,请参考以下文章

反应 useEffect 比较对象

MFC中用UpdateData来刷新数据

MFC中用UpdateData来刷新数据

在 SwiftUI 上的 Firebase 中使用 updateData 函数时出错

powershell 这将遍历站点下的所有子站点,然后查找列表并更新列表中的链接字段。这是upda的一个例子

Laravel如何将HTML保存到数据库然后检索它