在执行自定义验证之前,MFC初始化日期时间选择器控件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在执行自定义验证之前,MFC初始化日期时间选择器控件相关的知识,希望对你有一定的参考价值。
我有一个带有两个日期时间控件的对话框,其格式设置为time。一个表示开始时间,另一个表示结束时间。
其中一个要求是开始时间不能超过结束时间,结束时间不能早于开始时间。
因此,我通过SetTime()
函数提前一小时将结束时间初始化为当前时间。
我的问题是我正在初始化OnInitDialog()
方法中的两个控件,但是DoDataExchange()
在OnInitDialog()
函数之前运行,因此开始时间和结束时间完全相同,这导致我的验证失败并且对话框没有被创建。日期的检查是在我改编自here的自定义验证器中完成的
如何才能首先初始化日期时间控件?或者我可能没有正确地接近这个或者是否有我遗漏的东西?
在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
";
}
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_bSaveAndValidate
以检查您是否处于保存阶段。
if (pDX->m_bSaveAndValidate)
TimePickerValidation(pDX);
以上是关于在执行自定义验证之前,MFC初始化日期时间选择器控件的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery datepicker 自定义日期格式验证(无法摆脱美国日期验证)