C# 验证日期文本框

C# 验证日期文本框,c#,winforms,validation,datetime,textbox,C#,Winforms,Validation,Datetime,Textbox,我使用以下代码检查文本框中是否键入了有效日期: public bool ValidateDate(Control ctrl) { if (!string.IsNullOrEmpty(ctrl.Text)) { DateTime value; if (!DateTime.TryParse(ctrl.Text, out value)) { return false; } } ret

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

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/yyy和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;
    }

创建一个正则表达式,该表达式将日期模式与所有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"))
        {
            //....
        }

创建一个正则表达式,该表达式将日期模式与所有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"))
        {
            //....
        }

您可以尝试使用正则表达式:

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

我从这里借用了regexp:

您可以尝试使用正则表达式:

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

我从这里借用了regexp:

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

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

您可以使用,它对用户更友好,可以为您完成以下任务:

您可以使用,它对用户友好一点,可以为您完成以下任务:


不要忘记,如果您想灵活使用,是否考虑DateTime的区域设置,可以是dd/mm/yyyy UK、mm/dd/yyyy USA,甚至yyyy/mm/dd,斜杠分隔符也可以不同。使用cultureinfo类来处理此问题。如果您希望灵活,请不要忘记是否考虑DateTime的区域设置,它可以是dd/mm/yyyy UK、mm/dd/yyyy USA,甚至yyyy/mm/dd,斜杠分隔符也可以不同。使用cultureinfo类来处理这个问题。我完全忘记了TryParseExact+DateTime.TryParseExact有一个覆盖,可以接受多种格式,所以我不必放弃格式的灵活性。谢谢杰出的我已经忘记了超负荷。我很高兴这对你有用。很好。我完全忘记了TryParseExact+DateTime.TryParseExact有一个覆盖,可以接受多种格式,所以我不必放弃格式的灵活性。谢谢杰出的我已经忘记了超负荷。我很高兴这对你有用。通常,我会。。。但是,我使用的是Telerik的WinForms控件,而他们的MaskedEditBox有太多问题。不管怎样,谢谢你的建议。通常,我会。。。但是,我使用的是Telerik的WinForms控件,而他们的MaskedEditBox有太多问题。无论如何,谢谢你的建议。