Format de saisie pour date

Résolu
TéddyChnouki_54 Messages postés 38 Statut Membre -  
 Utilisateur anonyme -
Bonjour,
J'ai un formulaire visual basic 2017 avec une quantité de dates à saisir.
Je souhaiterai savoir si il existe un format pour saisir les dates sans être obligé de saisir les "/", en fait mettre automatiquement le "/" comme pour un formulaire sans access ??.
Je vous remercie par avance.
Cordialement

Philippe./.

3 réponses

  1. Utilisateur anonyme
     
    Bonsoir,

    pour l'interpréter, j'ai codé ça vite fait, je ne suis pas sûr que c'est à toute épreuve
    Private Function EstCeUneDate(ByVal Texte As String, <System.Runtime.InteropServices.Out()> ByRef LaDate As Date) As Boolean
    	'on essaye directement d'en faire une date
    	If Date.TryParse(Texte, LaDate) Then
    		Return True
    	End If
    
    	'Si ça ne marche pas, on essaye d'interpreter
    	LaDate = Date.MinValue 'il faut une valeur par défaut
    
    	'il faut trouver un nombre entre 1 et 31, avec un séparateur ( /\-_) en option, suivi d'un nombre entre 1 et 12, avec le même séparateur en option, suivi de 2 à 4 chiffres
    	'Pour cela j'utilise une regex http://regexstorm.net/tester?p=%28%3f%3cjour%3e%28%3f%3a3%5b01%5d%29%7c%28%3f%3a%5b12%5d%5cd%29%7c%28%3f%3a0%3f%5b1-9%5d%29%29%28%5b+%2f%5c%5c-_%5d%29%3f%28%3f%3cmoi%3e%28%3f%3a1%5b0-2%5d%29%7c%28%3f%3a0%3f%5b1-9%5d%29%29%5c1%3f%28%3f%3cannee%3e%5cd%7b2%2c4%7d%29&i=12%2f12%2f5678%0d%0a32%2f10%2f5678%0d%0a10318
    	Dim pattern As String = "^(?<jour>(?:3[01])|(?:[12]\d)|(?:0?[1-9]))([ /\\-_])?(?<moi>(?:1[0-2])|(?:0?[1-9]))\1?(?<annee>\d{2,4})$"
    	Dim m As Match = Regex.Match(Texte, pattern)
    
    	If m.Success Then
    		'le modèle est bon, reste à savoir si ça fait une date, le 31 avril n'existe pas, le 29 février ça dépend etc...
    		'on commence par faire des nombres avec les morceaux de texte
    		Dim jour As Integer = Convert.ToInt32(m.Groups("jour").Value)
    		Dim moi As Integer = Convert.ToInt32(m.Groups("moi").Value)
    		Dim annee As Integer = Convert.ToInt32(m.Groups("annee").Value)
    
    		'si l'année est sur 2 chiffres, arbitrairement je choisi que 00 à 29 c'est 2000 à 2029, et 30 à 99, c'est 1930 à 1999
    		If annee < 30 Then
    			annee += 2000
    		ElseIf annee < 100 Then
    			annee += 1900
    		End If
    
    		'enfin on essaye d'en faire une date
    		Return Date.TryParse(String.Format("{0}/{1}/{2}", jour, moi, annee),LaDate)
    
    	End If
    
    	Return False
    End Function
    
    Private Sub textBox3_Validating(ByVal sender As Object, ByVal e As CancelEventArgs)
    	Dim laDate As Date
    	If EstCeUneDate(textBox3.Text, laDate) Then
    		textBox3.Text = laDate.ToShortDateString() 'on affiche la date remise en forme
    	Else
    		MessageBox.Show("Ceci n'est pas une date valide")
    		e.Cancel = True
    	End If
    End Sub


    Ce qui est sûr c'est que certain textes sans séparateur pouvant être interprétés de plusieurs façons le seront par la 1ere possible selon mon algorithme.
    Par exemple 10318 c'est 10/03/2018 est pas 01/03/2018 ni 10/03/0018.

    1
  2. garrix_du77 Messages postés 68 Statut Membre 2
     
    tu peut faire le Type = Date normalement
    0
    1. TéddyChnouki_54 Messages postés 38 Statut Membre
       
      bonjour, ok merci
      0
  3. Utilisateur anonyme
     
    Bonsoir,
    tu peux utiliser un MaskedTextBox.

    Mais ce qui est plus "user friendly" c'est d'écrire un interpréteur qui serait reconnaitre que
    010118 équivaut à 01012018 équivaut à 01-01-18 etc... et vaut 01/01/2018
    0
    1. TéddyChnouki_54 Messages postés 38 Statut Membre
       
      Bonjour, ok merci, je vais regarder ça ce week-end
      0
    2. Utilisateur anonyme
       
      Si tu optes pour l'interpréteur, je te donnerais des pistes.
      0