2009-11-18 78 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