MFC中的日期验证

时间:2013-04-16 08:58:38

标签: visual-c++ mfc

我有FROM和TO日期的两个日期时间选择器控件。我想将TO日期开始日期限制为FROM日期。

示例:如果FROM日期是2013年4月12日 TO日期选择器应允许用户仅从2013年12月4日到当前日期选择日期。

DoDataExchange()方法中的代码如下。

 DDX_Text(pDX, IDC_DATETIME_FILTER_FROM, m_daysStartDateVal);
 DDV_MinMaxDateTime(pDX, m_daysStartDateVal,&StartDate,&COleDateTime::GetCurrentTime());
 DDX_Text(pDX, IDC_DATETIME_FILTER_TO, m_daysEndDateVal);
 DDV_MinMaxDateTime(pDX,m_daysEndDateVal,&m_daysStartDateVal.GetTickCount(),&COleDateTime::GeCurrentTime());

每当我更改FROM日期时,它都不会反映TO日期选择器中的可能日期。

如何将其限制为FROM日期的开始日期?

2 个答案:

答案 0 :(得分:2)

对话框数据验证不起作用。您只能指定(静态)范围,并且例程会验证您的值是否在该预定义范围内。您可以使用自己的验证例程扩展此机制。

下面的示例函数需要两个变量和一个范围,并确保

void AFXAPI DDV_MinMaxDates(
   CDataExchange* pDX,
   COleDateTime& fromValue, COleDateTime& toValue,
   const COleDateTime* refMinRange, const COleDateTime* refMaxRange)
{
  if(fromValue > toValue ||
     fromValue < refMinRange || fromValue > refMaxRange ||
     toValue < refMinRange || toValue > refMaxRange)
  {
     AfxMessageBox(_T("Incorrect interval!"));
     pDX->Fail();
  }
}

你可以像这样使用它:

DDV_MinMaxDates(pDX, m_daysStartDateVal, m_daysEndDateVal, &StartDate,&COleDateTime::GetCurrentTime());

答案 1 :(得分:0)

如果您希望CDateTimeCtrl控件根据两个控件中的当前输入动态更改允许的范围,则可以使用CDateTimeCtrl::SetRange。要在每次更改其中一个控件时调用SetRange,您应该处理发送给父级的DTN_DATETIMECHANGE通知。