我有一个对话框,其中有两个日期时间控件,其格式设置为时间。一个代表开始时间,另一个代表结束时间。
要求之一是开始时间不能早于结束时间,并且结束时间不能早于开始时间。
因此,我要通过SetTime()
函数将结束时间比当前时间提前一小时初始化。
我的问题是我正在使用OnInitDialog()
方法初始化两个控件,但是DoDataExchange()
在OnInitDialog()
函数之前运行,因此开始时间和结束时间是完全相同的这导致我的验证失败,并且未创建对话框。日期检查是在我自here
如何获取要首先初始化的datetime控件?还是我可能无法正确处理此问题,或者我缺少什么?
在OnInitDialog()
中:
BOOL CNewManualEntryDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_dtStartTime.SetRange(&GetTodayTimeMin(), &GetTodayTimeMax());
m_dtEndTime.SetRange(&GetTodayTimeMin(), &GetTodayTimeMax());
m_dtEndTime.SetTime(&SetEndTimeOneHourAhead());
return TRUE;
}
以上函数仅返回一个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);
}
答案 0 :(得分:4)
您一直在进行验证。总是意味着,当您将数据加载到对话框中以及提交数据时,您正在执行验证。
两种方式都调用 DoDataExchange()
。您可以确定pDX->m_bSaveAndValidate
来检查您是否处于保存阶段。
if (pDX->m_bSaveAndValidate)
TimePickerValidation(pDX);