2013-04-16 74 views
0

對於FROM和TO日期,我有兩個日期時間選擇器控件。我想將TO date的起始日期限制在FROM日期。MFC中的日期驗證

示例:如果FROM日期爲2013年4月12日 TO日期選擇器應允許用戶僅從2013年4月12日至當前日期選擇日期。

代碼如下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 date選擇器中的可能日期。

我如何限制它到FROM日期的開始日期?

+0

m_daysStartDateVal和m_daysEndDateVal的類型是什麼? –

+0

當需要「const COleDateTime *」時,爲什麼要傳遞「&m_daysStartDateVal.GetTickCount()」? –

+0

請調整您的問題,以便更清楚地表明您希望CDateTimeCtrl動態更改行爲 - 不僅是DDV_調用。 (至少你對Marius的回答的評論似乎是這樣的。) –

回答

1

對話框數據驗證不起作用。您只能指定一個(靜態)範圍,並且例程會驗證您的值是否在預定義的範圍內。然而,您可以使用您自己的驗證程序擴展此機制。

下面的例子函數有兩個變量和一個範圍,並確保

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()); 
+0

我做了同樣的驗證(消息框)。但我想在日期選擇器控件(日曆類型)上動態限制它,而不使用消息框。 – CodeLearner

+0

我沒有看到DDV_MinMaxDates如何提供幫助。使用DDV_MinMaxDateTime可以完成相同的檢查。唯一的區別是你可以提供更好的錯誤信息。 –

0

如果你想CDateTimeCtrl控制,以動態地改變允許範圍取決於兩個控件中的當前輸入,則可以使用CDateTimeCtrl::SetRange。每次更改一個控件時要調用SetRange,您應該處理髮送給父項的DTN_DATETIMECHANGE通知。

+0

非常感謝。我是MFC的新手,所以我正在努力完成工作。 – CodeLearner