在执行自定义验证之前,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初始化日期时间选择器控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring 身份验证管理器之前执行自定义处理程序

MFC 自定义 - 添加新工具栏?

使用 jQuery datepicker 自定义日期格式验证(无法摆脱美国日期验证)

我想在dll的类里面 添加一个自定义的初始化函数,不知道怎么弄?

如何在 ASP.net Core 中创建日历日期/选择器?

MFC 数据验证