验证日期文本框

时间:2009-11-18 00:04:23

标签: 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;
        }
    }
    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;
    }

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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

答案 2 :(得分:1)

创建一个与所有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 :(得分:1)

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

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