MFC在执行自定义验证之前初始化日期时间选择器控件

时间:2018-09-05 08:56:03

标签: c++ mfc

我有一个对话框,其中有两个日期时间控件,其格式设置为时间。一个代表开始时间,另一个代表结束时间。

要求之一是开始时间不能早于结束时间,并且结束时间不能早于开始时间。

因此,我要通过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);
}

1 个答案:

答案 0 :(得分:4)

您一直在进行验证。总是意味着,当您将数据加载到对话框中以及提交数据时,您正在执行验证。

两种方式都调用

DoDataExchange()。您可以确定pDX->m_bSaveAndValidate来检查您是否处于保存阶段。

if (pDX->m_bSaveAndValidate)
   TimePickerValidation(pDX);