2009-11-18 66 views
1

我用下面的代碼來檢查有效日期已經被輸入到一個文本框:驗證日期文本框

public bool ValidateDate(Control ctrl) 
{ 
    if (!string.IsNullOrEmpty(ctrl.Text)) 
    { 
     DateTime value; 
     if (!DateTime.TryParse(ctrl.Text, out value)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 


private void txtStartDate_Validating(object sender, CancelEventArgs e) 
{ 
    if (Utils.ValidateDate(txtStartDate)) 
    { 
     errorProvider.SetError(txtStartDate, ""); 
    } 
    else 
    { 
     errorProvider.SetError(txtStartDate, "* Invalid Date"); 
     e.Cancel = true; 
    } 
} 

這工作正常對於被輸入米日期/ d/YY,M/d/yyyy,mm/dd/yy,mm/dd/yyyy。如果用戶輸入諸如「11/17」之類的日期,則這將評估爲有效日期,但不幸的是,我只希望具有全部三個日期部分的日期。

有沒有簡單的方法來做到這一點?我在想如果檢查文本框中是否有2個「/」,我想了很長的一段時間,但我確信有一個更清晰的方法來實現所需的結果。

編輯:謝謝大家的所有建議!我結束了使用下面的代碼,它接受M/d/yyyy的和M/d/yy的〜

public bool ValidateDate(Control ctrl) 
    {   
     if (!string.IsNullOrEmpty(ctrl.Text)) 
     { 
      string[] formats = {"M/d/yyyy", "M/d/yy"}; 
      DateTime value; 

      if (!DateTime.TryParseExact(ctrl.Text, formats, new CultureInfo("en-US"), DateTimeStyles.None, out value)) 
      { 
       return false; 
      }     
     } 
     return true; 
    } 

回答

6

的DateTime.TryParseExact(..)函數確實允許您使用特定日期格式(例如,「mm/dd/yyyy」)解析日期。但是,如果您想在一年中的位數上靈活一點,那麼正則表達式可能是更好的選擇。

+0

不錯。我完全忘記了TryParseExact。從我+1。 – 2009-11-18 00:19:40

+2

DateTime.TryParseExact()具有覆蓋以接受多種格式,因此我不必放棄格式靈活性。謝謝! – Sesame 2009-11-18 00:46:35

+0

優秀。我忘記了那個過載。我很高興爲你工作。 – 2009-11-18 01:03:31

1

創建匹配與所有3種組分的日期圖案的正則表達式,並使用該驗證而不是日期時間。的TryParse。

這裏是一個代碼示例位:

if (Regex.IsMatch(ctrl.Text, @"(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d")) 
     { 
      //.... 
     } 
+1

不要忘了,如果你想成爲靈活,是否考慮區域設置日期時間,可能是dd/mm/yyyy(英國),mm/dd/yyyy(美國),或者甚至是yyyy/mm/dd,斜線分隔符也可能不同。使用cultureinfo類來處理這個.. – t0mm13b 2009-11-18 00:13:32

2

你可以嘗試使用正則表達式:

Regex dateRegExp = new Regex("^(((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00|[048])))$"); 

Match m = dateRegExp.Match(dateString); 

if (m.Success) { 
    //Valid Date' 
} 
else 
{ 

    //No soup for you, 1 year' 
} 

(從這裏我 「借」 正則表達式:RegExpLib

+0

+1 //對你沒有湯,1年' – HelloW 2012-11-20 19:49:07

1

你可以使用MaskedTextBox,這是一個小更人性化,並會爲你做的validation

private void Form1_Load(object sender, EventArgs e) 
{ 
    maskedTextBox1.Mask = "00/00/0000"; 
    maskedTextBox1.ValidatingType = typeof(System.DateTime); 
} 
+0

通常情況下,我會...但是,我使用Telerik的WinForms控件,並且我們的MaskedEditBox的問題太多了。感謝您的建議,任何方式。 – Sesame 2009-11-18 00:45:21