在OnOK中保存对话框数据时出现问题

Jon*_*ood 3 c++ mfc

有没有人找到将对话框数据保存到数据库中的好方法CMyDialog::OnOK

void CMyDialog::OnOK()
{

    // If I save my data here, I don't know if DoDataExchange()
    // found validation errors.

    CDialog::OnOK();

    // If I save my data here, EndDialog() has already been called

}
Run Code Online (Sandbox Code Playgroud)

寻找有关如何最好地构造它的想法。我知道规范是让调用者根据需要保存数据,但是如果在将数据保存到数据库时遇到错误,我不希望对话框关闭。

如果CDialog::UpdateData()是虚拟的,似乎是一个不错的解决方案,但事实并非如此。

And*_*kle 5

为什么不只是使用UpdateData

返回值:

如果操作成功,则返回非零值;否则返回0。否则为0。如果bSaveAndValidateTRUE,则返回值非零表示数据已成功验证

所以:

void CMyDialog::OnOK()
{
    if(!UpdateData(TRUE))
    {
        // There was some error with the validation procedure so don't end the dialog.
        return; // Suppress closing dialog
    }

    // OK to save data
    if(!SaveDataToDatabase())
    {
        // Some error
        return;
    }

    // Data validated Ok and was saved to DB OK, so close
    EndDialog(IDOK);
}
Run Code Online (Sandbox Code Playgroud)

除非我想念,否则请理解您的问题。

  • 因为如果验证错误,它将返回false。因此,您不必调用`CDialog :: OnOK();`而是直接返回。因此您的对话框保持打开状态。 (3认同)
  • 但是为什么它必须是虚拟的?您只需声明“如果在将数据保存到数据库时遇到错误,我不希望对话框关闭”。 (2认同)
  • 因此,您说要从我的OnOK()处理程序调用UpdateData(),并在返回false时返回。如果返回true,则保存数据。如果一切正常,我可能应该调用EndDialog()而不是CDialog :: OnOK()来避免验证例程运行两次。我想应该可以。我不确定要在调用CDialog :: OnOK()还是两次运行验证之间进行选择。 (2认同)