Проверить текстовое поле даты - PullRequest
1 голос
/ 18 ноября 2009

Я использую следующий код, чтобы проверить, была ли введена правильная дата в текстовое поле:

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

Это прекрасно работает для дат, которые вводятся м / д / гг, м / д / гггг, мм / дд / гг, мм / дд / гггг. Если пользователь вводит дату, такую ​​как «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 ]

6 голосов
/ 18 ноября 2009

Функция DateTime.TryParseExact (..) позволяет анализировать дату, используя определенный формат даты (например, «мм / дд / гггг»). Однако, если вы хотите быть гибкими в отношении количества цифр в году, лучшим выбором может быть регулярное выражение.

2 голосов
/ 18 ноября 2009

Вы можете попробовать использовать регулярные выражения:

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 )

1 голос
/ 18 ноября 2009

Вы можете использовать MaskedTextBox , который немного более удобен для пользователя и сделает проверку для вас:

private void Form1_Load(object sender, EventArgs e)
{
    maskedTextBox1.Mask = "00/00/0000";
    maskedTextBox1.ValidatingType = typeof(System.DateTime);
}
1 голос
/ 18 ноября 2009

Создайте регулярное выражение, соответствующее шаблону даты со всеми 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"))
        {
            //....
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...