Interdire des caractère dans une textbox [Résolu]

Signaler
Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020
-
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
-
Bonjour je suis en train de me pratiquer sur le VB puis je sais deja comment interdire les caratères dans une textbox en revanche je ne sais pas pour une textbox qui se crée seulement quand j'appuis sur un bouton et c'est la meme chose pour quand il n'y a rien de marquer dans la textbox. Merci d'avance pour votre aide !

13 réponses

Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Cette réponse est une première approche, qui suppose que tu débutes et aussi que tu ne fera cela que pour un seul formulaire.

Bon supposons qu'au départ, il y a déjà plusieurs Textbox sur ton formulaire, et si ça n'est pas le cas, ça va quand même servir pour la suite.
Dans mon exemple, il y en a 3


On serait tenté de faire ça
Public Class Form6

    'Note que j'ai corrigé le code pour coller à ce que je t'ai dit plus haut.
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}

        If Not num.Contains(e.KeyChar) And Not e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
        End If
    End Sub

    Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
        Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}

        If Not num.Contains(e.KeyChar) And Not e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
        End If
    End Sub

    Private Sub TextBox3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox3.KeyPress
        Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}

        If Not num.Contains(e.KeyChar) And Not e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
        End If
    End Sub
End Class


C'est une erreur, en effet, si tu dois modifier le code (autoriser la virgule par exemple), et bien tu dois le faire autant de fois que tu as multiplié le code.

Un principe de base en programmation, c'est que dès que l'on doit écrire 2 fois la même chose, il faut essayer au maximum de factoriser le code (1 code pour plusieurs utilisations).

Première étape, écrire une méthode qui fait ce que l'on veut, dans mon exemple, on l'ai déjà 3 fois, je me contente, d'en renommer une et de supprimer les 2 autres

Public Class Form6
    Private Sub JusteLesNombres_KeyPress(sender As Object, e As KeyPressEventArgs)'j'ai aussi supprimé la fin de la ligne
        Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}

        If Not num.Contains(e.KeyChar) And Not e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
        End If
    End Sub

End Class


Ensuite dans le mode design, je vais associer les keypress de chaque TextBox à cette méthode


Une fois fait, mes 3 textbox agissent comme je le souhaite avec un seul code.
Si tu le savais déjà, c'est de la révision ;).

Ce que je viens de faire s'appelle abonner une méthode déléguée à un évènement.
Pour que ça marche, Visual Studio est aller écrire pour nous le code d'abonnement dans le code behind
    Private Sub JusteLesNombres_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox3.KeyPress, TextBox2.KeyPress


Le mot clé
Handles
indique que la méthode est abonnée au évènements dont la liste suit TextBox1.KeyPress, TextBox3.KeyPress, TextBox2.KeyPress

Quand on ajoute des textbox par le code, c'est ce mécanisme qu'il faut reproduire.
        Dim tb As New TextBox

        tb.Location = New Point(200, 50)
        tb.Name = "nb1"
        Me.Controls.Add(tb)
        AddHandler tb.KeyPress, AddressOf JusteLesNombres_KeyPress 'c'est là

Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Message de 10h09, 3eme ligne
, et si ça n'est pas le cas, ça va quand même servir pour la suite.


Même message, dernière ligne de texte
Quand on ajoute des textbox par le code, c'est ce mécanisme qu'il faut reproduire.

Puis le code qui va avec.

Quand au c, je ‘ai expliqué dans le message de 9h32, un tableau de char, ça s’instancie avec des chars, et pas avec des strings.

Si tu ne sais pas différencier des strings de chars, c’est que tu as fais l’erreur de nombreux autodidactes (moi aussi en mon temps et je m’en suis mordu les doigts) => faire l’impasse sur les bases.

Le meilleur conseil que je puisse te donner, c’est de mettre ton projet de côté quelques jours, le temps de suivre un cours en ligne
Celui-ci par exemple, http://plasserre.developpez.com/cours/vb-net/

Un fois fait, tu ne seras pas un codeur aguerri (il faut bien plus que quelques jours pour ça) mais tu auras le socle nécessaire à ton apprentissage. Et au passage de comprendre mes messages d’aujourd’hui
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Bonjour

y'a plein de façons d'arriver à ça, ça dépend de comment tu as fait au départ.

Peux tu poster ton code qui empêche la saisie de caractères et celui qui crée les boutons.
Pour poster du code, il faut appliquer ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020

voila mon code mon but est d'interdire les lettres dans la textbox crée puis faire une sécurité si exemple il n'y a rien dans la textbox pour éviter que le programme crash ...

dans le code ci-dessous "tb" =
Dim tb As TextBox = New TextBox()

cb1 = combo box
lb1 = label


        Dim cb1 As String = cb.Text

        Select Case cb1
            Case Is = "Cercle"

                tb.Location = New Point(36, 44)
                tb.Name = "nb1"
                Me.Controls.Add(tb)

                Me.Controls.Remove(tb2)
                Me.Controls.Remove(tb3)

                lb1.Location = New Point(63, 30)
                lb1.Text = "Rayon"



Merci !
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Ok, mais il me manque un élément, tu as dit
je sais deja comment interdire les caratères dans une textbox
il me faudrait ce code là aussi
Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020

et voila ;)

        Dim num() As Char = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}

        If Not num.Contains(e.KeyChar) And Not Asc(e.KeyChar) = Keys.Back Then
            e.Handled = True

        End If
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Bonjour,
Alors, de ce que je voies, je déduis que
  • tu travailles en winform
  • tu as utilisé l'évènement Keypress.


Ma réponse va être longue à rédiger, donc avant toute chose, je vais te parler de ça
        Dim num() As Char = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}

        If Not num.Contains(e.KeyChar) And Not Asc(e.KeyChar) = Keys.Back Then
            e.Handled = True

        End If


Si tu veux rester un bidouilleur en VB.Net, tu peux t'en contenter, ça va marcher dans 99,99% des cas, mais un jour peut-être ça plantera pour une obscure raison.
Il y a 2 causes
  • d'abord
    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
    ce sont des string et pas des Char, il y a conversion implicite, il est possible qu'un jour ce que tu crois implicite ne soit pas ce que le compilateur juge implicite.
  • ensuite
    Asc()
    c'est pas du VB.Net, c'est du VB6, pareil dans 99,99% des cas, ça fonctionne et un jour non. En plus VB.Net est un langage tout objet, alors que VB6 non, ça fait donc mélanger 2 paragdimes.


Je t'invite à lire cet article sur le sujet https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net et ensuite d'activer Option Strict et supprimer la référence à Visual Basic.
Tout ce que je te présenterai dans ma prochaine réponse sera basé sur ces 2 points.
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
Bon, supposons maintenant, que tu aies besoin de ce comportement dans plusieurs formulaires.
Appliquer ce que je viens de t'apprendre, reviendrait à multiplier la méthode JusteLesNombres_KeyPress autant de fois qu'il y a de formulaire et donc à nouveau piétiner le principe de base : la factorisation.

Une bonne solution (la bonne solution ? ) est d'écrire ton propre contrôle.
Un contrôle est un objet comme les autres à ceci prêt qu'il a une interface graphique.
Tout principe de base de la programmation objet peut donc lui être appliqué.
Notamment l'héritage.
Si tu ne sais pas ce qu'est l'héritage, je t'invite à lire cette suite de 3 tutos https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3 sur la programmation objet en .Net
Etant autodidacte, j'ai essayé de l'écrire pour un public autodidacte.

On va commencer par ajouter une nouvelle classe

On l'appelle NombreTextBox

Dans le code behind je vais dire que cette classe hérite d'une textbox
Public Class NombreTextBox
    Inherits TextBox


End Class


Je vais ensuite copier coller le code de JusteLesNombres_KeyPress
Public Class NombreTextBox
    Inherits TextBox

    Private Sub JusteLesNombres_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress 'ici je précise qu'on est abonné à notre propre évènement
        Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}

        If Not num.Contains(e.KeyChar) And Not e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
        End If
    End Sub

End Class


Je reviens faire le ménage sur mon formulaire:
  • suppression de la méthode JusteLesNombres_KeyPress
  • suppression de la ligne d'abonnement dynamique
  • suppression des 3 textbox

Public Class Form6

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim tb As New TextBox

        tb.Location = New Point(200, 50)
        tb.Name = "nb1"
        Me.Controls.Add(tb)
    End Sub
End Class


En mode design on constate que NombreTextBox apparait dans la boite à outils (il faut parfois générer la solution pour le voir)


Je pose donc 3 NombreTextBox sur mon formulaire et dans la génération dynamique, j'instancie des NombreTextBox au lieu de textbox
Public Class Form6

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim tb As New NombreTextBox 'c'est là

        tb.Location = New Point(200, 50)
        tb.Name = "nb1"
        Me.Controls.Add(tb)
    End Sub
End Class
Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020

D'accord mais ca règle pas mon probleme car ma textbox n'est pas dans ma form elle se crée seulement quand je sélectionne un item dans ma combo box ...
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
J'ai pris 1h30 à rédiger tout ça, tu penses vraiment que juste pour m'amuser j'aurais perdu tout ce temps à t'expliquer quelque chose qui ne correspond pas du tout à ce que tu as demandé?

Je veux bien admettre que tu n'aies pas tout compris, mais avant de dire que ça ne règle pas ton problème, tu aurais pu au moins essayer....

Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020

Le problème c'est que ici tu me la démontré avec des textbox deja dans ta form donc l'event keypress tu peux le programmer alors que moi non car je n'est aucune textbox ...
jais essayer de comprendre ce que tu mas dit j'ais meme relis plusieurs fois cependant je n'arrive pas a comprendre comment regler mon problème avec ce que tu me montrer et en meme temps je voulais savoir a quoi sert-il le "c" dans
Dim num() As Char = {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}
Messages postés
6
Date d'inscription
vendredi 3 avril 2020
Statut
Membre
Dernière intervention
5 avril 2020

Ah merde non excuse moi ... tout fonctionne parfaitement j'avais mal compris ce que tu me montrais. Merci de ta patience et merci aussi pour le site http://plasserre.developpez.com/cours/vb-net/. Je m'en excuse encore ... :/
Messages postés
14870
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
413
De rien.