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

VB.NET Discussion :

Comment bloquer les caractères alphabétiques dans un champ pour écrire seulement les chiffres?


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Guinée

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 112
    Points : 90
    Points
    90
    Par défaut Comment bloquer les caractères alphabétiques dans un champ pour écrire seulement les chiffres?
    j'ai fais un formulaire Windows Form et je voudrais bloquer les caractères alphabétiques du clavier pour que l'utilisateur puisse seulement écrire les Chiffres et espacement dans un champ donné dont voici un exemple de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub txtnomgrp_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnomgrp.TextChanged
     
        End Sub
    Merci d'avance!

  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Un peu de recherche et tu aurais trouvé ce topic.
    En l'adaptant à tes contraintes (espaces autorisé) et en rajoutant un test sur l'event TextChanged pour prévenir le copier/coller ça donnerait :

    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
     
        Private Sub LTextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles LTextBox2.KeyPress
     
            If Not Char.IsControl(e.KeyChar) AndAlso Not IsNumeric(e.KeyChar) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> " " Then
                e.Handled = True
                MessageBox.Show("Valeur numérique uniquement !")
            End If
     
        End Sub
     
        Private Sub LTextBox2_TextChanged(sender As Object, e As EventArgs) Handles LTextBox2.TextChanged
     
            For Each c As Char In LTextBox2.Text.ToCharArray
                If Not IsNumeric(c) AndAlso c <> "." AndAlso c <> " " Then
                    LTextBox2.Text = LTextBox2.Text.Replace(c, String.Empty)
                    MessageBox.Show("Valeur numérique uniquement !")
                End If
            Next
     
        End Sub
    Je te laisse le soin de décortiquer le code et les fonctions du framework utilisées pour le comprendre.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #3
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je me permet de revenir sur ce sujet car depuis un moment la réutilisation de contrôles est en quelque sorte une de mes préoccupations, ca évite de devoir saisir un pavé de code au niveau des gestionnaires d'évènements du formulaire principal.
    En m'étant inspiré de ceci RegExTextbox, voilà l'extension du contrôle Textbox que je propose (en toute modestie) sans devoir taper du code ailleurs [/B]:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    Imports System
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Drawing
    Imports System.Text
    Imports System.Windows.Forms
    Imports System.Text.RegularExpressions
     
    Partial Public Class TextBoxEx
        Inherits TextBox
     
    #Region " Declarations "
        Private m_errorProvider As ErrorProvider = Nothing
    #End Region
     
    #Region " Properties "
        Public Property UseRegularExpressionPattern As String
        Public Property UseRegularExpression As Boolean
        Public Property UseRegularExpressionErrorMessage As String
    #End Region
     
    #Region " Constructor "
        Public Sub New()
            m_errorProvider = New ErrorProvider
        End Sub
    #End Region
     
    #Region " Methods "
        Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
            MyBase.OnPaint(pe)
        End Sub
     
        Protected Overrides Sub OnValidating(e As CancelEventArgs)
            'OnValidating est déclenché lorsqu'on clique sur un autre contrôle dans la zone cliente du formulaire
            MyBase.OnValidating(e)
            SetErrorProvider()
        End Sub
     
        Protected Overrides Sub OnTextChanged(e As EventArgs)
            'OnTextChanged est déclenché lorsqu'un caractère est saisi dans la textbox.
            MyBase.OnTextChanged(e)
            SetErrorProvider()
        End Sub
     
        Private Sub SetErrorProvider()
            If UseRegularExpression And Not UseRegularExpressionPattern Is Nothing Then
                'On appelle la Fonction qui permet de vérifier l'exactitude des caractères saisis dans la textbox 
                If ValidateControl() = False Then
                    'Me.Text = String.Empty
                    If Not Me.Text.Length = 0 Then
                        Me.Text = Me.Text.Substring(0, Me.Text.Length - 1)
                        Me.Select(Me.Text.Length, 0)
                    End If
                    'ErrorProvider affiche une infobulle rouge à droite de la textbox.
                    m_errorProvider.SetError(Me, UseRegularExpressionErrorMessage)
                Else
                    'La saisie est valide donc rien n'est affiché dans ErrorProvider
                    m_errorProvider.SetError(Me, String.Empty)
                End If
            End If
        End Sub
     
        Private Function ValidateControl() As Boolean
            Dim TextToValidate As String
            Dim expression As Regex
            'On place le parsing du pattern dans un bloc Try ...Catch car il peut être erroné !
            Try
                TextToValidate = Me.Text
                expression = New Regex(UseRegularExpressionPattern)
            Catch
                Return False
            End Try
            ' Si le pattern est bon alors on vérifie que le texte tapé correspond au pattern 
            Return expression.IsMatch(TextToValidate)
        End Function
    #End Region
     
    End Class
    Comment l'utiliser :

    1- Ajouter une nouvelle classe dans votre projet nommée : Cls_TextboxEx
    2- Sélectionnez le code plus haut et collez-le dans votre classe Cls_TextboxEx (écrasez le contenu !)
    3- Regénérez votre projet
    4- Passez en mode "Concepteur de vues"
    5- Dans votre boite à outils sélectionnez le contrôle "Cls_TextboxEx" puis faites-le glisser sur votre formulaire
    http://imabox.fr/a3/1416071027rZd6o103.png
    6- Enfin sélectionnez votre texbox puis paramétrez les propriétés :
    - "UseRegularExpressionPattern" avec le pattern "^[0-9\b]+$" (ou le pattern RegEx que vous voulez)
    - "UseRegularExpression" à "True"
    - "UseRegularExpressionErrorMessage" avec la valeur "Vous devez saisir uniquement des chiffres !"
    ..... comme suit :
    http://imabox.fr/a3/1416071126IUWP7W13.png

    Voilà en image le résultat lorsque l'utilisateur tape un caractère alphabétique et non alphanumérique comme le préconise le patterne RegEx :

    http://imabox.fr/a3/1416071025EK0FKA41.png

    PS : On pourrait parfaitement l'agrémenter en instanciant l'objet ErrorProvider uniquement si la propriété UseRegularExpression est passée à True.....etc..... ce n'est qu'une ébauche....

    A+

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour Wallace1,

    Merci pour le partage

    Si je peux me permettre 2 petites suggestions

    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            ' Si le pattern est bon alors on vérifie que le texte tapé correspond au pattern 
            If expression.IsMatch(TextToValidate) Then
                Return True
            Else
                Return False
            End If
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            ' Si le pattern est bon alors on vérifie que le texte tapé correspond au pattern 
            Return expression.IsMatch(TextToValidate)
    Vu que l'on peut choisir un pattern, le message
    "Vous devez saisir uniquement des chiffres !"
    pourrait être remplacé par une propriété publique (renseigné par l'utilisateur comme le pattern)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Merci rv26t,

    Les 2 modifications ont été apportées.

  6. #6
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Etant donné que mon précédent post date et que je ne peux plus le modifier voilà la dernière modification du contrôle suite aux remarques constructives apportées par Sehnsucht :

    --> Suppression de la méthode OnPaint (il est vrai qu'elle ne servait absolument à rien !)
    --> Création d'une propriété privée m_useRegularExpressionRegex ça évite de créer une nouvelle instance à chaque saisie de caractère. Çela permet également de tester le pattern dans le setter de la propriété UseRegularExpressionPattern


    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    Imports System
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Drawing
    Imports System.Text
    Imports System.Windows.Forms
    Imports System.Text.RegularExpressions
     
    Partial Public Class TextBoxEx
        Inherits TextBox
     
    #Region " Declarations "
        Private m_errorProvider As ErrorProvider = Nothing
        Private m_useRegularExpressionRegex As Regex = Nothing
    #End Region
     
    #Region " Properties "
        Private _UseRegularExpressionPattern As String
        Public Property UseRegularExpressionPattern() As String
            Get
                Return _UseRegularExpressionPattern
            End Get
            Set(ByVal value As String)
                If value IsNot Nothing Then m_useRegularExpressionRegex = New Regex(value, RegexOptions.Compiled)
                _UseRegularExpressionPattern = value
            End Set
        End Property
     
        Public Property UseRegularExpression As Boolean
        Public Property UseRegularExpressionErrorMessage As String
    #End Region
     
    #Region " Constructor "
        Public Sub New()
            m_errorProvider = New ErrorProvider
        End Sub
    #End Region
     
    #Region " Methods "
     
        Protected Overrides Sub OnValidating(e As CancelEventArgs)
            'OnValidating est déclenché lorsqu'on clique sur un autre contrôle dans la zone cliente du formulaire
            MyBase.OnValidating(e)
            SetErrorProvider()
        End Sub
     
        Protected Overrides Sub OnTextChanged(e As EventArgs)
            'OnTextChanged est déclenché lorsqu'un caractère est saisi dans la textbox.
            MyBase.OnTextChanged(e)
            SetErrorProvider()
        End Sub
     
        Private Sub SetErrorProvider()
            If UseRegularExpression And UseRegularExpressionPattern IsNot Nothing Then
                'On appelle la Fonction qui permet de vérifier l'exactitude des caractères saisis dans la textbox 
                If ValidateControl() = False Then
                    'Me.Text = String.Empty
                    If Not Me.Text.Length = 0 Then
                        Me.Text = Me.Text.Substring(0, Me.Text.Length - 1)
                        Me.Select(Me.Text.Length, 0)
                    End If
                    'ErrorProvider affiche une infobulle rouge à droite de la textbox.
                    m_errorProvider.SetError(Me, UseRegularExpressionErrorMessage)
                Else
                    'La saisie est valide donc rien n'est affiché dans ErrorProvider
                    m_errorProvider.SetError(Me, String.Empty)
                End If
            End If
        End Sub
     
        Private Function ValidateControl() As Boolean
            ' Si le pattern est bon alors on vérifie que le texte tapé correspond au pattern 
            Return m_useRegularExpressionRegex.IsMatch(Me.Text)
        End Function
    #End Region
     
    End Class
    Merci Sehnsucht.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment supprimer les valeurs nulls dans un champ
    Par souhail72 dans le forum Formules
    Réponses: 3
    Dernier message: 15/01/2014, 11h13
  2. [XSL] Comment remplacer un caractère uniquement dans les noms de balises d'un XML ?
    Par houston81 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/08/2012, 21h44
  3. comment insérer les caractères spéciaux dans sql server 2005
    Par dev-deb dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 03/10/2010, 14h08
  4. Réponses: 5
    Dernier message: 01/02/2010, 02h14
  5. [Encoding] Comment stocker les caractères arabes dans un fichier XML?
    Par merci_tous dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 13/02/2007, 17h57

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