【问题标题】:Validate date textbox验证日期文本框
【发布时间】:2009-11-18 00:04:23
【问题描述】:

我正在使用以下代码检查是否在文本框中输入了有效日期:

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;
    }
}

这适用于输入 m/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;
    }

【问题讨论】:

    标签: c# winforms validation datetime textbox


    【解决方案1】:

    DateTime.TryParseExact(..) 函数允许您使用特定日期格式(例如,“mm/dd/yyyy”)解析日期。但是,如果您想灵活调整年份的位数,那么正则表达式可能是更好的选择。

    【讨论】:

    • 不错。我完全忘记了 TryParseExact。来自我的 +1。
    • DateTime.TryParseExact() 具有接受多种格式的覆盖,因此我不必放弃格式灵活性。谢谢!
    • 优秀。我忘记了那个超载。我很高兴这对你有用。
    【解决方案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

    【讨论】:

      【解决方案3】:

      创建一个与包含所有 3 个组件的日期模式匹配的正则表达式,并使用它来验证而不是 DateTime.TryParse。

      这是一段代码示例:

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

      【讨论】:

      • 别忘了,如果你想灵活一点,是否考虑日期时间的区域设置,可能是 dd/mm/yyyy (UK), mm/dd/yyyy (USA),甚至 yyyy/mm/dd,斜线分隔符也可能不同。使用cultureinfo 类来处理这个..
      【解决方案4】:

      您可以使用MaskedTextBox,它对用户更友好,并且会为您执行validation

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

      【讨论】:

      • 通常情况下,我会...但是,我使用的是 Telerik 的 WinForms 控件,而他们的 MaskedEditBox 出现了太多问题。感谢您的建议,无论如何。
      猜你喜欢
      • 2013-02-24
      • 2012-03-10
      • 2011-12-07
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多