IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] limiter les valeurs d'un champs aux nombres


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut [VB.NET] limiter les valeurs d'un champs aux nombres
    Bonjour,

    Présentation :
    Ceci est mon premier post sur votre forum. Je ne suis pas très à l'aise pour l'instant avec, si bien que je ne sais même pas sur quel critère faire une recherche pour régler mon problème.
    Aussi, j'espères que vous me pardonnerez si j'ai posté au mauvais endroit.

    Contexte :
    Je suis un newbie en programmation.
    Je viens d'installer Visual Studio Express 2005 et j'essaie de faire mon 1er programme :
    un convertisseur FRANCS / EUROS.

    J'ai fais la partie esthetique et les choses se compliquent maintenant que je dois mettre du code.

    J'ai pas mal avancé et le convertisseur fonctionne. Je voudrais maintenant le déboguer.

    Problème :
    Mon problème actuel est le suivant :
    Si à la place de la somme à convertir, on met du texte, ça fait planter l'opération.

    Je voudrais donc forcer le champs "à convertir" à ne recevoir que des chiffres et rien d'autre (faire un champ au format "numerique").

    Je pourrai bien sur faire un MsgBox qui dise qu'on n'accepte que des chiffres mais, je voudrais savoir si c'est possible de carrément ne pouvoir que saisir des chiffres et que si on essaie de taper des lettres, la saisie de ne fasse pas. Un peu comme dans une cellule Excel dont on aurait défini le format à "numerique".

    Je vous met ci-joint une image de mon convertisseur

    Merci pour votre aide.
    Images attachées Images attachées  

  2. #2
    Membre du Club
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    122
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 122
    Points : 63
    Points
    63
    Par défaut
    Alors pour ton probleme je te recommande d'utiliser le control NumericUpDown, t'as un quelque proprietes pas mal, genre limiter le nombre de chiffres apres la virgule des trucs comme ca et facile a utiliser en plus.

    Et une fois tes calculs fait si tu veux afficher ton resultat dans une messagebox tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MessageBox::Show(Convert::ToString(resulat));

  3. #3
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Salut,
    pour ma part je resterai avec un TextBox avec un contrôle sur KeyPress genre if not isnumeric...
    Tu peux aussi ajouter un composant ErrorProvider qui sera plus esthétique (et moins ch***) qu'une MessageBox.
    Je n'ai rien testé mais voilà le fond de ma pensée !
    Pensez aux règles et au qui rime avec !

  4. #4
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 273
    Points : 1 280
    Points
    1 280
    Par défaut
    avant de faire quoi que ce soit tu mets ce code pour vérifier que l'utilisateur a bien saisi un chiffre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     If not isnumeric(textbox.Text) Then
                ErrorProvider1.SetError(textbox, "il faut un chiffre !")
     Exit Sub
     Else
                ErrorProvider1.SetError(textbox, "")
     End If
    j'suis vert !

  5. #5
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Bonjour,

    Il y a plusieurs solutions à ton problème.

    1)Utiliser un controle qui n'accépte que les chiffres (genre numericUpAndDown)
    2)Intercépter l'évènement KeyPress de ton textbox, tester si la touche appuyée est un chiffre, si c'est pas un chiffre tu annules la frappe.
    3)Laisser rentrer du texte dans ta textBox mais tester que la valeur est bien un nombre avant de lancer le calcul

    ... il y a aussi le controle MasquedTextBox qui te permets de faire un équivalent de la solution 2 mais j'ai jamais trop utilisé (à la base c'est plutôt prévu pour la saisie sous forme standardisée genre une adresse ip un numéro de télephonne, ...)

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Je vous remercie pour vos réponses.
    J'ai l'impression que "numericUpAndDown" correspondrait à ce que je voudrai faire. Je vais me renseigner là dessus (en gardant sous le coude les autres solutions).
    Merci encore.

  8. #8
    Membre régulier Avatar de netomin
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Points : 102
    Points
    102
    Par défaut
    Didonc avec toutes ces réponses cette discussion je pense merite bien dejà d'être close .

    On voit qu'on est de plus en plus nombreux c'est bien.
    Il y a toujours une réponse, il suffit de la trouver.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Fermez pas tout de suite je teste les solutions une après l'autre !

    En fait j'ai essayé le "NumericUpandDown" qui est super pratique mais qui ne correspond pas esthetiquement au résultat escompté.

    Je vais essayer les autres soluces, notament celle de Hulk

    Je n'en suis pas encore à la soluce de la FAQ indiquée par abelman mais j'y viens doucement

  10. #10
    Membre régulier Avatar de netomin
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Points : 102
    Points
    102
    Par défaut
    Quand je disais
    cette discussion merite d'être close
    Je rigolais et aussi j'ai parlé au sens figuré.
    C'est à toi de juger si tu met RESOLU à ta discussion, selons si ta trouvé ce que tu cherchais.

    à +
    Il y a toujours une réponse, il suffit de la trouver.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bein mon problème c'est que la solution de la FAQ fonctionne parfaitement,
    sauf 2 problèmes :

    ça ne prend en compte

    - ni le backspace (pour corriger un montant érronné)
    - ni le séparateur décimal (pour mettre une somme avec des centimes)

    Vous avez une soluce ?

    Voici mon code actuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    Public Class fenetre
     
     
        Dim taux As Decimal = 6.55957
     
     
        Private Sub BoxSource_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles BoxSource.KeyPress
            If Not Char.IsDigit(e.KeyChar) Then
                'Tous les caractères non numériques ne sont pas traités sur le TextBox.  
                e.Handled = True
            End If
        End Sub
     
     
        Private Sub BoutonFRF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonFRF.Click
            BoxResultat.Text = taux * BoxSource.Text
        End Sub
     
     
        Private Sub BoutonEuros_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonEuros.Click
            BoxResultat.Text = taux / BoxSource.Text
        End Sub
     
     
    End Class

  12. #12
    Membre régulier Avatar de netomin
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Points : 102
    Points
    102
    Par défaut
    Pour accepter le backspace, et la virgule, il faut changer ton code comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    IfNot (Char.IsDigit(e.KeyChar) OrChar.IsControl(e.KeyChar) OrChar.ToString(e.KeyChar) = ",") Then
    'Tous les caractères non numériques ne sont pas traités sur le TextBox. 
    e.Handled = True
    EndIf
    
    Peut être il ya d'autres solutions mais cela marche.

    à +
    Il y a toujours une réponse, il suffit de la trouver.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Excellent ! Merci

    L'avantage de ta solution est de m'ouvrir les yeux sur le code Visual Basic et de me montrer certaines subtilités.

    J'ai rajouté des espaces entre "Or" et "Char."

    Je vais chercher si je peux
    - remplacer le caractere décimal "," par "."
    - et changer la présentation des chiffres des milliers "2006" >> "2 006"

    ci-joint l'état actuel du convertisseur
    Images attachées Images attachées  

  14. #14
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par fabrozor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    BoxResultat.Text = taux * BoxSource.Text
    ...
    Salut,
    voici un conseil que l'on m'a donnée dès le début et qu'il me semble utile de te transmettre : toujours rajouter ces deux réferences en début de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Strict On
    Option Explicit On
    Elles t'obligent à déclarer explicitement tes variables (dim x as...) et bloquent tout cast automatique (string=integer).
    Ceci devrait faire apparaître des erreurs dans ton code...
    Tu peux faire par exemple ceci : (mais il y a d'autre possibilités...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoxResultat.Text = (taux * Convert.ToDouble(BoxSource.Text)).ToString()
    Pensez aux règles et au qui rime avec !

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par toniolol
    Salut,
    voici un conseil que l'on m'a donnée dès le début et qu'il me semble utile de te transmettre : toujours rajouter ces deux réferences en début de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Strict On
    Option Explicit On
    Elles t'obligent à déclarer explicitement tes variables (dim x as...) et bloquent tout cast automatique (string=integer).
    Ceci devrait faire apparaître des erreurs dans ton code...
    Salut Toniolol,
    Merci pour tes conseils.
    Dis, "Option..." faut le mettre avant ou après ma première ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class fenetre
    ...
    Pour ce qui est du débogage, ça me bloque quand je veux lancer mon programme. Ca me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "impossible de démarrer le débogage. Handle de liaison non valide"
    Alors du coup je vais dans l'onglet "Projet> propriété> Déboger" et je décoche la case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Activer le processus d'hébergement visual studio".
    Citation Envoyé par toniolol
    Tu peux faire par exemple ceci : (mais il y a d'autre possibilités...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoxResultat.Text = (taux * Convert.ToDouble(BoxSource.Text)).ToString()
    Ca sert à quoi dans ce cas là ton .ToString() ?

  16. #16
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par fabrozor
    Salut Toniolol
    Dis, "Option..." faut le mettre avant ou après ma première ligne ?
    Il faut le placer tout en haut de ton code avant toute déclaration.
    Citation Envoyé par fabrozor
    Ca sert à quoi dans ce cas là ton .ToString() ?
    La signature de la propriété Text d'une TextBox est un String donc si on est pointilleux on ne peux pas y mettre un Double. (c'est l'equivalent de Convert.ToString).
    Je recherche peut-être un petit peu trop la petite bête mais j'aime bien quand c'est propre...
    Pensez aux règles et au qui rime avec !

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par toniolol
    BoxResultat.Text = (taux * Convert.ToDouble(BoxSource.Text)).ToString()
    hmm...
    Dans ce cas là ne vaudrait il pas mieux ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoxResultat.Text = Convert.ToString(taux * Convert.ToDouble(BoxSource.Text))
    ?

  18. #18
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Je dirai que c'est la même chose
    Pour caster x en un string tu peux utiliser :
    x.ToString()
    Convert.ToString(x)
    Ctype(x,string)
    Il en existe surement d'autre que je n'utilise pas genre DirectCast il me semble...
    Pensez aux règles et au qui rime avec !

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Ok.

    J'ai ajouté "Option Strict" et "Option Explicit" au début.

    Ta syntaxe est un raccourci de quelqu'un qui maitrise ces concepts. Je crois que je vais rester simple au début pour mieux comprendre ce que j'écris.

    Par contre j'ai un problème.

    Si je converti 12,05 FRF en euros j'obtiens la bonne somme (79,0428185)
    Si je converti 12,05 Euros en FRF j'obtiens une somme erronée (0,54436265560166)

    Aurais tu une idée de mon erreur ?

    Rappel de mon code pour le bouton de conversion en euros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub BoutonEuros_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonEuros.Click
            BoxResultat.Text = Convert.ToString(taux / Convert.ToDouble(BoxSource.Text))
        End Sub

  20. #20
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoxResultat.Text = Convert.ToString(Convert.ToDouble(BoxSource.Text)/taux)
    Pensez aux règles et au qui rime avec !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Diviser les valeurs d'un champ
    Par celine86 dans le forum Access
    Réponses: 7
    Dernier message: 14/02/2006, 09h58
  2. récupérer les valeur d'un champ FILE
    Par dj-julio dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/12/2005, 11h54
  3. Requete SELECT : prendre toutes les valeurs pour 1 champ
    Par fab22montpellier dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/09/2005, 09h12
  4. Réinitialiser les valeurs d'un champ de type identify
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/01/2005, 13h39
  5. [VB.NET] Choisir les valeurs des items d'un combo box?
    Par Eithelgul dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/06/2004, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo