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 :

utilisation point pavé numérique dans datagridview [Débutant]


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut utilisation point pavé numérique dans datagridview
    Bonjour,
    Ce programme permet de pouvoir utiliser le point du pavé numérique car cela le remplace par une virgule.
    Avec le labelb2 cela marche nickel, maintenant je voudrais l'adapter aux valeurs entrées dans le datagridview ici la colonne : (datagridview1.rows().cells(Coefficientimpermeabilisation)) mais je ne trouve pas comment faire. L'erreur est donc seulement dans les 2 premières private sub.

    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
    Private Const K_FILTRE_DOUBLE As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,.-+*/\()!:;"
     
        Private Sub DataGridView1.Rows().Cells("Coefficientimpermeabilisation").Value_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles DataGridView1.Rows().Cells("Coefficientimpermeabilisation").Value.KeyPress
            filtrerFrappe(sender, e, K_FILTRE_DOUBLE)
        End Sub
     
        Private Sub DataGridView1.Rows().Cells("Coefficientimpermeabilisation").Value_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.Rows().Cells("Coefficientimpermeabilisation").Value.KeyUp
            CType(sender, TextBox).Text = CType(sender, TextBox).Text.Replace(".", ",")
            CType(sender, TextBox).SelectionStart = CType(sender, TextBox).Text.Length
        End Sub
     
        Private Sub Labelb2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Labelb2.KeyPress
            filtrerFrappe(sender, e, K_FILTRE_DOUBLE)
        End Sub
     
        Private Sub Labelb2_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Labelb2.KeyUp
            CType(sender, TextBox).Text = CType(sender, TextBox).Text.Replace(".", ",")
            CType(sender, TextBox).SelectionStart = CType(sender, TextBox).Text.Length
        End Sub
     
        Private Sub filtrerFrappe(ByRef txtCourant As TextBox, ByRef e As System.Windows.Forms.KeyPressEventArgs, ByVal sFiltre As String)
            Dim bFiltrer As Boolean = False
            Dim cFrappe As String = e.KeyChar
            If cFrappe = "." Then cFrappe = ","
            bFiltrer = (sFiltre.IndexOf(cFrappe) = -1)
            If cFrappe = "," Then
                If txtCourant.Text.IndexOf(cFrappe) <> -1 Then
                    bFiltrer = True
                Else
                    bFiltrer = (txtCourant.Text.Length = 0)
                End If
            End If
            If cFrappe = ControlChars.Back Then bFiltrer = False
            e.Handled = bFiltrer
        End Sub
    Voila mon message d'erreur :
    DataGridView1 est déjà déclaré en tant que Friend WithEvents DataGridView1 As System.Windows.Forms.DataGridView dans ce class
    Merci.

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    bonjour,

    Tu as remarquer que sur tes des évènements tu as le même Handles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Handles DataGridView1.Rows().Cells("Coefficientimpermeabilisation").Value.KeyUp
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Oui, pourquoi? il ne faut pas?
    J'ai toujours mis la même chose jusqu'à présent et cela fonctionnait.
    Sa signifie quoi le handles?
    Je dois mettre quoi à la place du coup?
    Merci

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Salut,
    J'ai modifié la partie qui ne fonctionnait pas comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub ValeurCI_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
            Dim ValeurCI As Double = Convert.ToDouble(Me.DataGridView1.Rows(1).Cells("Coefficientimpermeabilisation").Value)
            filtrerFrappe(sender, e, K_FILTRE_DOUBLE)
        End Sub
     
        Private Sub ValeurCI_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) 
            CType(sender, TextBox).SelectionStart = CType(sender, TextBox).Text.Length
        End Sub
    Je n'es pas d'erreur mais cela ne fonctionne toujours pas. Le point du pavé numérique n'est pas remplacé par une virgule.

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Le Handles est une sorte de pointeur sur ta fonction.
    Normalement tu n'as pas a y toucher!

    Si dans ton interface tu souhaites faire un évènement sur le key_up de ton datagridview, dans ton code, tu sélectionne ton datagridview, et dans la liste des évènement tu sélectionnes Key_up.

    Il va te créer la structure de ta fonction tout seul (nom, argument et Handles). Il le fait très bien, et on ne devrait pas créer un handles soit même à moins de s'y connaitre vraiment.

    Apparement ton Handles permet de préciser la cellule dans laquelle l'évènement va se déclencher.

    Donc mon conseil, mets le contenu de ton code de coté, efface tes procédures et recréer les de manière propre.
    Si tu souhaites que ton code ne s'execute que si le key_up était fait depuis une certaine colonne, qu'a cela ne tienne, la première chose que tu vas faire dans ta procédure, c'est de tester la colonne active, et en fonction de ça tu lances ton code.

    Pourquoi réinventer la roue, alors que VB.NET a tout préparé
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Non ton test est "faux"... car dans l'évènement Key_Press ou Key_up, la valeur n'est pas encore saisie dans la cellule, donc tu ne peux pas la récupérer dans ta cellule...

    Par contre, la touche appuyé est dans l'argument de ta fonction e.

    Donc tu peux faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub ValeurCI_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
     
          If e.KeyChar = "." Then e.KeyChar = CType(",", Char)
     
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Merci pour vos réponses.
    Mais malheuresement cela ne marche pas.

    Si dans ton interface tu souhaites faire un évènement sur le key_up de ton datagridview, dans ton code, tu sélectionne ton datagridview, et dans la liste des évènement tu sélectionnes Key_up.
    Quand je fais cela, sa ne marche pas non plus, puis je ne voudrais pas sélectionner le datagriview mais les valeurs des cellules et on ne peut pas sélectionner cela.

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    De toute façon... ton évènement sera obligatoirement attaché à ton DatagridView. Car c'est le contrôle qui est utilisé et d'où l'évènement se déclenche.

    Quand tu dis qu'il ne marche pas.... As tu mis un point d'arrêt sur la ligne en question ? il n'y s’arrête donc pas quand tu appuies sur une touche, lorsque tu es dans une cellule ?

    Peux tu montrer le code ?

    Peut être qu'effectivement le Key_up ne se déclenche pas lorsqu'on saisie une donnée dans une cellule, il faudrait juste être sur (via le point d'arrêt)..

    si c'est confirmer, alors il faudrait essayer un autre évènement.
    Par exemple l'évènement "CellValidating" de ton DGV.

    Cet évènement se déclenche lorsque lorsque tu as saisies quelque chose dans une cellule et que tu as valider (en cliquant ailleurs ou en appuyant sur entrée).

    Alors tu retrouve ta cellule, soit pas les arguments de l'évènement, soit en utilisant la propriété CurrentCell, et tu traites le texte saisies. Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.DGV.CurrentCell.Value = Replace(Me.DGV.CurrentCell.Value, ".", ",")
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Je ne comprend pas l'histoire du point d'arret, je suis débutant.
    Concernant le code, je l'es posté dans le premier message.
    J'ai testé differentes choses mais toujours pas trouver de solutions.

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Si tu veux coder, il va falloir que tu saches ce qu'est un point d'arrêt et passer sur ton code au pas-à-pas.

    Cherche un tutorial débutant de Visual Studio... Sans ça tu n'iras pas très loin....
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Désolé, c'est pas du VB.NET
    Salut,

    J'ai un peu de mal à comprendre comment ça se fait que ce sujet n'est pas clos depuis le temps que je le vois remonter à toutes les sauces...

    Voici un exemple COMPLET, avec version compilée afin de t'éviter d'avoir à installer VS C# 2010, de ce que tu veux faire, mais c'est en C#.

    J'ai aussi mis en exemple la solution pour le faire sur une TextBox.

    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
     
    using System;
    using System.Windows.Forms;
     
    namespace TestDataGrid
    {
        public partial class Form1 : Form
        {
            bool isDecimalPressed = false;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Datagrid_Editing(object sender, DataGridViewEditingControlShowingEventArgs args)
            {
                args.Control.KeyDown += new KeyEventHandler(Control_KeyDown);
                args.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress);
                args.Control.KeyUp += new KeyEventHandler(Control_KeyUp);
            }
     
            private void Control_KeyDown(object sender, KeyEventArgs args)
            {
                if (args.KeyData == Keys.Decimal)
                {
                    isDecimalPressed = true;
                }
            }
     
            private void Control_KeyUp(object sender, KeyEventArgs args)
            {
                isDecimalPressed = false;
            }
     
            private void Control_KeyPress(object sender, KeyPressEventArgs args)
            {
                // Fonctionnement standard, donc pas de gestion de la touche décimale
                if (radioButton1.Checked) return;
     
                // Le point du pavé numérique s'appelle Decimal en .NET
                if (args.KeyChar == '.' && isDecimalPressed)
                {
                    args.KeyChar = ',';
                }
            }
        }
    }
    Explication :

    KeyUp et KeyDown permettent de savoir si c'est la douche Decimal qui a été frappée ou la touche Oemperiod.
    En revanche, ils ne permettent pas de modifier la touche saisie.

    KeyPress ne permet pas de différencier Oemperiodet Decimal, mais permet de modifier le caractère correspondant à la touche pressée.

    Donc :
    Sur le KeyDown, on initialise un booléen qui indique si c'est bien la touche Decimal qui a été pressée
    Sur le KeyPress, on remplace '.' par ',' si le booléen est true
    Sur le KeyUp, on réinitialise le booléen

    Et l'astuce sur le Datagrid : KeyPress/KeyUp/KeyDown ne sont pas déclenchés sur un Datagrid quand on saisie dans une cellule.
    Il faut récupérer le contrôle d'édition, et lui associer les contrôles comme qui :
    - Dans le handler de l'event DataGridViewEditingControlShowing, on va affecter les handlers KeyDown, KeyPress et KeyUp sur le args.Control correspondant

    Voilà, j'espère que ça va enfin résoudre ton problème.
    Fichiers attachés Fichiers attachés
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Après relecture en détail des échanges, je comprends mieux pourquoi tu t'en sors pas.

    Tu n'as pas la bonne approche.

    => Lors de l'édition, il faut laisser l'utilisateur saisir ce qu'il veut. C'est au moment de la validation de la saisie (sur le blur du contrôle par exemple) qu'il faut vérifier la cohérence des données saisies.

    Le code que je t'ai donné reproduit exactement le comportement d'Excel lorsqu'on saisi dans une cellule.

    Et comme Excel, il ne t'interdit pas de saisir manuellement un point '.' si tu en as envie, ni de saisir des lettres.

    C'est au moment où on sort de la cellule qu'il faut vérifier que l'ensemble de la valeur saisie correspond bien au type attendu. C'est comme ça que fonctionnent toutes les IDE dignes de ce nom.

    Donc ta fonction qui vérifie si c'est un double, tu la déclenche sur le Blur du args.Control dans le handler DataGridViewEditingControlShowing
    On ne jouit bien que de ce qu’on partage.

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Sur ton datagridview, tu ajoutes un handler "cellendedit" :

    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
     
     
            private void Control_CellEndEdit(object sender, DataGridViewCellEventArgs args)
            {
                if (args.ColumnIndex == 1)
                {
                    double val = 0;
                    if (!double.TryParse((string)(sender as DataGridView)[args.ColumnIndex, args.RowIndex].Value, out val))
                    {
                        (sender as DataGridView)[args.ColumnIndex, args.RowIndex].ErrorText = "Ceci n'est pas un nombre !";
                    }
                    else
                    {
                        (sender as DataGridView)[args.ColumnIndex, args.RowIndex].ErrorText = string.Empty;
                    }
                }
            }
    Ensuite, au moment de l'enregistrement des données, tu vérifies qu'aucune colonne n'est en erreur.
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup
    mais je ne peux pas ouvrir le fichier en pièce jointe.
    Je suis sur visual basic 2010 express

  15. #15
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par doudou47 Voir le message
    Merci beaucoup
    mais je ne peux pas ouvrir le fichier en pièce jointe.
    Je suis sur visual basic 2010 express
    Pour décompresser un fichier 7z il faut le logiciel... 7zip

    Ensuite, c'est une solution C#, donc ton VB ne pourra pas l'ouvrir.
    En revanche, il y a une version compilée dans bin/debug afin de tester le résultat.

    Sinon, en transcrivant mes exemples de code ci-dessus, tu seras en mesure :
    - de saisir des nombres décimaux avec le pavé numérique, avec utilisation de ',' comme décimale
    - de mettre en erreur les cellules "numériques" qui contiennent une valeur non numérique

    Et ainsi résoudre ton problème de façon propre et claire pour l'utilisateur
    On ne jouit bien que de ce qu’on partage.

  16. #16
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Voici une ébauche d'un DataGridView dérivé qui reproduit en partie la comportement d'Excel :
    - Si le nombre saisi est numérique, on l'aligne à droite
    - Remplacement du caractère décimal par celui de la culture du thread (potentiellement, il n'y a pas que ","...)
    - Suppression du message d'erreur à la saisie d'un mauvais type, remplacé par un flag "error" sur la cellule, lorsque le type saisi ne correspond pas au type de la cellule (plus propre que de valider à la main)

    Désolé, c'est toujours en C#

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
     
    using System;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace ExcelDataGrid
    {
        /// <summary>
        /// DataGridView évoluée, qui reproduit un comportement proche d'Excel en ce qui concerne la saisie des nombre
        /// </summary>
        public partial class ExcelDataGrid : DataGridView
        {
            private bool isDecimalPressed = false;
            private char decimalCharacter;
     
            /// <summary>
            /// Instancie une nouvelle grille reproduisant le comportement d'Excel
            /// </summary>
            public ExcelDataGrid() : this(5, 10)
            {
            }
     
            public ExcelDataGrid(int nbColumns, int nbRows)
            {
                string name;
                for (int i = 0; i < nbColumns; i++)
                {
                    name = IntToExcelColumn(i + 1);
                    this.Columns.Add(name, name);
                }
     
                this.Rows.Add(nbRows);
     
     
                string decimalSeparator = Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
                if (decimalSeparator.Length != 1)
                {
                    throw new Exception("Séparateur des décimales invalide : vous devez utiliser un séparateur qui utilise un et un seul caractère.");
                }
                decimalCharacter = decimalSeparator[0];
     
                InitializeComponent();
     
                this.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(ExcelDataGrid_Editing);
                this.CellBeginEdit += new DataGridViewCellCancelEventHandler(ExcelDataGrid_CellBeginEdit);
                this.CellEndEdit += new DataGridViewCellEventHandler(ExcelDataGrid_CellEndEdit);
     
                this.DataError += new DataGridViewDataErrorEventHandler(ExcelDataGrid_DataError);
            }
     
            private void ExcelDataGrid_Editing(object sender, DataGridViewEditingControlShowingEventArgs args)
            {
                args.Control.KeyDown += new KeyEventHandler(Control_KeyDown);
                args.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress);
                args.Control.KeyUp += new KeyEventHandler(Control_KeyUp);
            }
     
            private void Control_KeyDown(object sender, KeyEventArgs args)
            {
                if (args.KeyData == Keys.Decimal)
                {
                    isDecimalPressed = true;
                }
            }
     
            private void Control_KeyUp(object sender, KeyEventArgs args)
            {
                isDecimalPressed = false;
            }
     
            private void Control_KeyPress(object sender, KeyPressEventArgs args)
            {
                if (args.KeyChar == '.' && isDecimalPressed)
                {
                    args.KeyChar = decimalCharacter;
                }
            }
     
            private void ExcelDataGrid_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs args)
            {
                DataGridViewCell cell = (sender as DataGridView)[args.ColumnIndex, args.RowIndex];
                cell.ErrorText = string.Empty;
            }
     
            private void ExcelDataGrid_CellEndEdit(object sender, DataGridViewCellEventArgs args)
            {
                DataGridViewCell cell = (sender as DataGridView)[args.ColumnIndex, args.RowIndex];
     
                if (cell.ValueType.Name.ToLower() == "object")
                {
                    double val = 0;
                    if (double.TryParse((string)cell.Value.ToString(), out val))
                    {
                        cell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                    }
                }
            }
     
            private void ExcelDataGrid_DataError(object sender, DataGridViewDataErrorEventArgs args)
            {
                DataGridViewCell cell = (sender as DataGridView)[args.ColumnIndex, args.RowIndex];
                cell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
                cell.ErrorText = args.Exception.Message;
                args.Cancel = false;
            }
     
            /// <summary>
            /// Permet de déterminer pour un indice donnée, la notation "colonne Excel"
            /// </summary>
            /// <param name="i">Indice pour lequel on veut déterminer le nom de "colonne Excel"</param>
            /// <returns>Nom de "colonne Excel"</returns>
            public static string IntToExcelColumn(int i) /* rajout du this pour méthode d'extension */
            {
                // Vérification de la validité du paramètre
                if (i < 1)
                {
                    throw new Exception("L'indice d'une colonne Excel est strictement suppérieur à 1");
                }
     
                // Un StringBuilder est ce qu'il y a de plus rapide en ce qui concerne 
                // la manipulation de chaîne de caractères, même si dans le cas de chaînes
                // de petite taille, c'est certainement inutile
                StringBuilder sb = new StringBuilder();
     
                while (i > 0)
                {
                    // Astuce de notation. Il ne faut pas trop chercher à comprendre...
                    // Gardez juste en tête qu'il ne s'agit pas d'un simple changement de base.
                    sb.Insert(0, (char)('A' + ((i-- - 1) % 26))); /* remplacement de Append par Insert(0, ... en début donc */
                    i /= 26;
                }
     
                return sb.ToString(); /* grâce à l'Insert plus besoin de reverse ici */
            }
     
            /* plus simple (et sans doute plus performant) qu'une regex
             * on pourrait carrément la mettre dans la méthode je pense) */
            private const string allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
            /// <summary>
            /// Permet de déterminer l'indice d'un nom de "colonne Excel"
            /// </summary>
            /// <param name="s">Nom de "colonne Excel"</param>
            /// <returns>Indice de la "colonne Excel"</returns>
            public static int ExcelColumnToInt(string s)
            {
                s = s.ToUpperInvariant(); /* des fois que la chaine passée soit en minuscules */
     
                // Vérification que le nom de la colonne ne contient que des caractères autorisés
                /* remplacement de la regex ;
                 * littéralement: au moins 1 caractère dans s n'est pas contenu dans ceux autorisés (perso je trouve ça propre) */
                if (s.Any(c => !allowedChars.Contains(c)))
                {
                    throw new Exception("Une colonne Excel ne comporte que des caractères de A à Z");
                }
     
                int ret = 0, currentIndex, lastIndex;
                currentIndex = lastIndex = s.Length - 1; /* initialisations multiples */
     
                while (currentIndex >= 0)
                {
                    // Idem que pour la fonction IntToExcelColumn : il ne s'agit pas d'un
                    // simple changement de base. Les "erreurs" sont volontaires.
                    ret += (s[currentIndex] - 'A' + 1) * (int)Math.Pow(26, lastIndex - currentIndex--);
                }
     
                // On n'a pas réussi à déterminer l'indice de la colonne.
                if (ret == 0)
                {
                    throw new Exception(string.Format("Impossible de déterminer l'indice de la colonne '{0}'.", s));
                }
                return ret;
            }
        }
    }
    On ne jouit bien que de ce qu’on partage.

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Merci, StringBuilder, j'ai essayé de tranformer le code C# en VB.net mais je n'es pas réussi.
    Ensuite j'ai trouvé ce programme sur internet :

    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
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
     
            ' on récupère le control TextBox de la cellule qui est édité        
     
            Dim voControl As DataGridViewTextBoxEditingControl = Nothing
     
            voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
     
            Select Case Me.DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name
                ' si la colonne qui est éditée est coefficientimpermeabilisation alors on gère l'événement KeyPress du TextBox             
     
                Case "coefficientimpermeabilisation"
     
                    RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
     
                    AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                Case Else
                    RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
            End Select
        End Sub
     
        Private Sub EditingControl_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
     
            ' on accepte que les caractères numériques, le point, ou la virgule        
     
            e.Handled = Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or e.KeyChar = "." Or e.KeyChar = ",")
     
            ' on récupère le texte du TextBox
     
            Dim txt As String = CType(sender, DataGridViewTextBoxEditingControl).Text
     
            ' on s'assure que le point ou la virgule n'a été tapé qu'une fois
     
            If (InStr(txt, ".") > 0 Or InStr(txt, ",") > 0) And (e.KeyChar = "." Or e.KeyChar = ",") Then
                e.KeyChar = Nothing
            Else
                ' on remplace le point par une virgule ou la virgule par un point en fonction du séparateur décimal utilisé dans la culture en cours
     
                Dim vsDecimalSeparator As Char
     
                If vsDecimalSeparator = "." And e.KeyChar = "." Then
                    e.KeyChar = ","
                End If
            End If
     
        End Sub
    Mais cela ne fonctionne pas. Est-ce que quelqu'un qui connait bien le language VB.net peut m'aider svp.
    Merci

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub DataGridView1_CellValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValidated
     
            If (DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value IsNot Nothing) Then
                Try
                    DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString.Replace(".", ",")
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
            End If
     
        End Sub

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/04/2014, 10h52
  2. Réponses: 6
    Dernier message: 06/01/2010, 14h48
  3. [OpenOffice][Texte] writer point pavé numérique
    Par andeve dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 26/11/2008, 11h32
  4. [d7]pavé numérique point et virgule
    Par dleu dans le forum Langage
    Réponses: 8
    Dernier message: 28/04/2006, 03h23
  5. Réponses: 7
    Dernier message: 06/11/2005, 14h47

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