C++ MFC在执行自定义验证之前初始化日期时间选择器控件
我有一个带有两个datetime控件的对话框,其格式设置为time。一个表示开始时间,另一个表示结束时间 其中一个要求是开始时间不能早于结束时间,结束时间不能早于开始时间 因此,我通过C++ MFC在执行自定义验证之前初始化日期时间选择器控件,c++,mfc,C++,Mfc,我有一个带有两个datetime控件的对话框,其格式设置为time。一个表示开始时间,另一个表示结束时间 其中一个要求是开始时间不能早于结束时间,结束时间不能早于开始时间 因此,我通过SetTime()函数在当前时间之前一小时初始化结束时间 我的问题是,我正在初始化OnInitDialog()方法中的两个控件,但是DoDataExchange()在OnInitDialog()函数之前运行,因此开始时间和结束时间完全相同,这会导致验证失败,无法创建对话框。日期的检查是在一个自定义验证器中完成的,我
SetTime()
函数在当前时间之前一小时初始化结束时间
我的问题是,我正在初始化OnInitDialog()
方法中的两个控件,但是DoDataExchange()
在OnInitDialog()
函数之前运行,因此开始时间和结束时间完全相同,这会导致验证失败,无法创建对话框。日期的检查是在一个自定义验证器中完成的,我从中改编
如何首先初始化datetime控件?或者我可能没有正确地处理这个问题,或者我遗漏了什么
在OnInitDialog()中
:
上面的函数只返回一个CTime
对象。
作为参考,验证程序如下所示:
void CNewManualEntryDlg::TimePickerValidation(CDataExchange* pDX)
{
CTime startTime;
CTime endTime;
m_dtStartTime.GetTime(startTime);
m_dtEndTime.GetTime(endTime);
BOOL isStartTimeBehindEndTime = startTime > endTime;
CString errorMsg;
if (!isStartTimeBehindEndTime)
{
errorMsg += "Error - Start time cannot be ahead of end time\n";
}
if (!errorMsg.IsEmpty())
{
::AfxMessageBox(errorMsg);
pDX->Fail();
return;
}
}
我只是在DoDataExchange()
中调用它:
void CNewManualEntryDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDDT_STARTTIMEPICKER, m_dtStartTime);
DDX_Control(pDX, IDDT_ENDTIMEPICKER, m_dtEndTime);
TimePickerValidation(pDX);
}
您总是在进行验证。始终意味着,在将数据加载到对话框中以及提交数据时,您正在执行验证
DoDataExchange()
以两种方式调用。您可以确定pDX->m_2;bSaveAndValidate
以检查您是否处于保存阶段
if (pDX->m_bSaveAndValidate)
TimePickerValidation(pDX);
您总是在进行验证。始终意味着,在将数据加载到对话框中以及提交数据时,您正在执行验证
DoDataExchange()
以两种方式调用。您可以确定pDX->m_bsave和validate
以检查是否处于保存阶段
if (pDX->m_bSaveAndValidate)
TimePickerValidation(pDX);
在DoDataExchange中移动SetRange和SetTime调用有什么问题?将
SetTime
放入DoDataExchange
不会覆盖用户通过对话框控件输入的内容吗?pDX->m_bsaveand Validate会让您知道。在DoDataExchange中移动SetRange和SetTime调用有什么问题?将SetTime
放入DoDataExchange
覆盖用户通过对话框控件输入的内容?pDX->m_bsavea和Validate会让您知道。谢谢!我不知道DoDataExchange()
是双向的(即初始化时验证和输入时验证),谢谢!我不知道DoDataExchange()
是双向的(即初始化时验证和输入时验证)