2009-11-18 5 views
1

textbox J'utilise le code suivant pour vérifier si une date valide a été tapé dans une zone de texte:Valider la date

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

Cela fonctionne bien pour les dates qui sont entrées m/j/aa, m/d/aaaa, mm/jj/aa, mm/jj/aaaa. Si un utilisateur entre une date telle que «11/17», la date d'évaluation sera valide, mais, malheureusement, je ne souhaite que les dates comportant les trois parties de date.

Y at-il un moyen facile de faire cela? Je pensais à quelque chose de long les lignes de vérification s'il y a 2 "/" dans la zone de texte, mais je suis sûr qu'il y a un moyen plus propre d'atteindre le résultat souhaité.

EDIT: Merci pour toutes les suggestions tout le monde! J'ai fini en utilisant le code suivant qui accepte M/d/yyyy et M/d/aa ~

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

Répondre

6

Les La fonction DateTime.TryParseExact (..) vous permet d'analyser une date en utilisant un format de date spécifique (par exemple, "mm/jj/aaaa"). Cependant, si vous voulez être flexible sur le nombre de chiffres dans l'année, alors une expression régulière pourrait être un meilleur choix.

+0

Nice. J'ai complètement oublié TryParseExact. +1 de moi. –

+2

Le DateTime.TryParseExact() a un remplacement pour accepter plusieurs formats, donc je n'ai pas eu à abandonner la flexibilité de mise en forme. Merci! – Sesame

+0

Excellent. J'avais oublié cette surcharge. Je suis content que ça a marché pour toi. –

1

Créer une expression régulière qui correspond à un modèle de date avec les 3 composants et l'utiliser pour valider au lieu de DateTime. TryParse.

Voici un peu d'exemple de code:

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

Ne pas oublier, si vous voulez faire preuve de souplesse, que ce soit pour tenir compte des paramètres régionaux pour DateTime, il pourrait être jj/mm/aaaa (Royaume-Uni), mm/jj/aaaa (USA), ou même aaaa/mm/jj, le séparateur de barre oblique pourrait également être différent. Utilisez la classe cultureinfo pour gérer cela .. – t0mm13b

2

Vous pouvez essayer d'utiliser des expressions régulières:

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

(I "emprunté" l'expression régulière d'ici: RegExpLib)

+0

+1 // Pas de soupe pour vous, 1 an ' – HelloW

1

Vous pouvez utiliser le MaskedTextBox, qui est un peu plus convivial et fera le validation pour vous:

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

Normalement, j'aurais ... mais, j'utilise les contrôles WinForms de Telerik et j'ai juste eu trop de problèmes avec leur MaskedEditBox. Merci quand même pour la suggestion. – Sesame

Questions connexes