Problème avec do... loop until

Dumpy92 Messages postés 7 Date d'inscription dimanche 17 avril 2011 Statut Membre Dernière intervention 30 avril 2011 - 18 avril 2011 à 00:10
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 - 18 avril 2011 à 08:12
Bonjour à tous, j'ai un problème avec le code suivant:
    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Do
            Me.TextBox2.Text = ""
        Loop Until IsNumeric(Me.TextBox2.Text)
        Valeur2 = Me.TextBox2.Text
    End Sub


Enfait, c'est pour un test dans une calculatrice. L'utilisateur devrait saisir ses valeurs dans deux cases séparées. Le but étant que ce soient évidemment des valeurs numériques, je cherche donc à empêcher la saisie de caractère. C'est pour ça que je me suis dit que ce code devrait réinitialiser la case jusqu'a ce que la valeur saisie soit numérique (avec le loop until). Mais voilà, ça ne marche pas ^^. Alors si vous avez des idées, ou une autre façon de faire, je suis preneur !

Merci d'avance à tous !

3 réponses

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
18 avril 2011 à 07:28
Bonjour,

Je ne connais pas .NET, mais il me semble qu'une fois rentré dans ta boucle il n'en sort jamais.

Pour ma part je testerais dans l'évènement KeyDown si le caractère entré est un chiffre
> 47 AND < 58.

Attention aussi à accepter le "." décimal.

Calade
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 avril 2011 à 08:10
Bonjour,

Calade a raison, mais attention, dans l'evenement keydown on ne connait pas le caractère frappé, mais son KeyCode.

Voici un exemple qui passe en revu les différentes possibilités :
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles TextBox1.KeyDown  Dim txtB as TextBox = CType(sender, TextBox)  

  'Appuis sur la touche "-"
  If (Not e.Shift) And (Not e.Control) And (Not e.Alt) And _
       ((e.KeyCode Keys.D6) Or (e.KeyCode Keys.Subtract)) Then
                
     'Si le curseur n'est pas au début du champ 
     'ou qu'un '-' est déjà présent
     If (txtB.SelectionStart <> 0) Or _
        ((txtB.Text.Length > 0) AndAlso (txtB.Text.Substring(0, 1) = "-")) Then
        e.SuppressKeyPress = True
     End If

  Else

     'Si la frappe ne correspond ni à un chiffre ou un déplacement ou une suppression
     If Not ((e.Shift And (Not e.Alt) And (Not e.Control) And _
        ((e.KeyCode >= Keys.D0) And (e.KeyCode <= Keys.D9))) Or _
        (e.KeyCode Keys.Left) Or (e.KeyCode Keys.Right) Or _
        (e.KeyCode Keys.End) Or (e.KeyCode Keys.Home) Or _
        ((Not e.Shift) And (Not e.Alt) And (Not e.Control) And _
              ((e.KeyCode = Keys.Enter) Or _
              (e.KeyCode = Keys.Back) Or _
              (e.KeyCode = Keys.Delete) Or _
              ((e.KeyCode >= Keys.NumPad0) And (e.KeyCode <= Keys.NumPad9))))) Then

             e.SuppressKeyPress = True

      End If
  End If

End Sub


J'avoue que le deuxième If fait mal au yeux, mais il controle toutes les frappes possibles dans le cas d'un numéric (sauf copier/coller que l'on peut ajouter si nécessaire) avec controle des combinaisons de touches spéciales avec Ctrl, Alt ou Shift.

Il y a aussi une technique moins lourde en controlant le text sur validation.

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
        If Not IsNumeric(Me.TextBox1.Text) Then
            MessageBox.Show("Veuillez saisir un numéric")
            e.Cancel = True
        End If
End Sub


En tout cas oubliez le do loop
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 avril 2011 à 08:12
Petit précision, mons exemple n'accepte pas les decimales.
0
Rejoignez-nous