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 :

masque de saisie pour un DataGridTextBox


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut masque de saisie pour un DataGridTextBox
    Bien le bonjour!

    Est-il possible de définir un masque de saisie pour un DataGridTextBox? Je voudrais que l'utilisateur ne puisse taper que des nombres dans une colonne d'un DataGridView. Est-ce possible?

    Je vous remercie!
    Avec mes sincères salutations,

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Non, ce n'est pas prévu
    Par contre tu peux toujours intercepter l'évènement KeyDown du DataGridView et bloquer ou non la touche

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    Bonjour,

    C'est mon intention. Mais comme une cellule de la grille est sélectionnée, ce sont les événements de la DataGridViewTextBoxCell qui se déclenchent.

    Seulement d'après ce que j'ai lu du code généré par VB, les DataGridViewTextBoxCell ne sont pas déclaré. Est-ce parceque la DataGridView vide?

    Dès lors, sais-tu où peut-on écrire le code des événements de la DataGridViewTextBoxCell ?
    Si je déclare une DataGridViewTextBoxCell dans mon code, comment puis-je la substituer à celle de la DataGridView ?

    A+

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah oui, j'avais pas pensé à ça... je pensais que l'évènement se déclenchait sur le DataGridView lui-même, mais en fait non. De plus c'est plutôt l'évènement KeyChar qu'il faut gérer.

    En fait les contrôles d'édition du DGV ne sont pas déclarés car ils sont créés dynamiquement par le DGV. Il y a quand même un moyen d'y accéder : l'évènement EditingControlShowing. A ce moment, il faut en profiter pour "accrocher" un handler à l'évènement KeyChar de ce contrôle. Comme il ne vaut mieux pas laisser un handler qui ne sert plus, on s'abonne aussi à VisibleChanged pour pouvoir enlever les handlers.

    Voilà une solution qui fonctionne :
    Code C# : 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
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                // Ajout des handlers quand le contrôle d'édition apparait
                // Seulement si c'est un TextBox
                if (e.Control is TextBoxBase)
                {
                    e.Control.KeyPress += new KeyPressEventHandler(editingControl_KeyPress);
                    e.Control.VisibleChanged += new EventHandler(editingControl_VisibleChanged);
                }
            }
     
            void editingControl_VisibleChanged(object sender, EventArgs e)
            {
                // Suppression des handlers quand le contrôle d'édition disparait
                Control ctl = sender as Control;
                if (!ctl.Visible)
                {
                    ctl.KeyPress -= editingControl_KeyPress;
                    ctl.VisibleChanged -= editingControl_VisibleChanged;
                }
            }
     
            void editingControl_KeyPress(object sender, KeyPressEventArgs e)
            {
                // On accepte seulement les chiffres et le séparateur décimal
                // Il faut aussi accepter la touche backspace ('\b')
     
                // Au passage, on remplace aussi le point par le
                // séparateur décimal de la culture courante (virgule en français)
                if (e.KeyChar == '.')
                    e.KeyChar = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
     
                bool ok = false;
                if (char.IsDigit(e.KeyChar))
                    ok = true;
     
                if (e.KeyChar == System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0])
                    ok = true;
     
                if (e.KeyChar == '\b')
                    ok = true;
     
                e.Handled = !ok;
            }

    Désolé, je viens de voir que tu le voulais en VB.NET... mais j'ai vraiment pas le courage de traduire

    Y a pas de grosse difficulté pour la traduction de toutes façons...
    - Pour les évènements, les équivalents de += et -= sont AddHandler et RemoveHandler.
    - Le ! se traduit en Not
    - '\b' se traduit en vbBack

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    ok, merci de l'info! j'étudie tout çà, et j'te donne des niews...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    Bonjour,

    J'ai réussis à traduire ton code C# en VB sans trop de difficultés. Je remercie encore

    Avec mes sincères salutations,

    PS: Voici le code VB. Si tu y vois un bug, n'hésites pas...

    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
     
     
        Private Sub DataGridViewDroite_EditingControlShowing(ByVal sender As System.Object, _
                    ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
                    Handles DataGridViewDroite.EditingControlShowing
     
            If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
                AddHandler e.Control.KeyPress, AddressOf editingControl_KeyPress
                AddHandler e.Control.VisibleChanged, AddressOf editingControl_VisibleChanged
            End If
        End Sub
     
        Sub editingControl_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
            If IsNumeric(e.KeyChar) Then
                e.Handled = False
            Else
                e.Handled = True
            End If
        End Sub
     
        Sub editingControl_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
            Dim oCtrl As Control = sender
            If Not oCtrl.Visible Then
                RemoveHandler oCtrl.KeyPress, AddressOf editingControl_KeyPress
                RemoveHandler oCtrl.VisibleChanged, AddressOf editingControl_VisibleChanged
            End If
        End Sub

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    ben à mon avis tu as un peu trop simplifié le code de editingControl_KeyPress...
    - tu ne peux pas saisir de nombres décimaux
    - tu ne peux pas corriger la saisie avec backspace

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Par défaut
    En fait, je n'ai pas besoin de saisir de nombres décimaux.
    Merci de m'avoir rappelé le BackSpace...

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

Discussions similaires

  1. Masque de saisie pour une adresse email
    Par Neilime05 dans le forum Access
    Réponses: 13
    Dernier message: 17/03/2018, 05h24
  2. [FORMULAIRE] Masque de saisie pour e-mail
    Par soforever dans le forum IHM
    Réponses: 2
    Dernier message: 26/04/2007, 14h15
  3. masque de saisie pour une inputbox ?
    Par tomo0013 dans le forum IHM
    Réponses: 3
    Dernier message: 23/02/2007, 11h28
  4. Masque de saisie pour zone de text
    Par achos dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/02/2007, 10h34
  5. [RegEx] Masque de saisie pour formulaire
    Par achos dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2007, 17h04

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