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 :

Valider un saisie dans un champ d'une DataGridView par la touche ENTREE


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut Valider un saisie dans un champ d'une DataGridView par la touche ENTREE
    Bonjour,
    J'ai créé une DATAGRIDVEW sous VB2010 Express avec des champs que l'on peut remplir après un click.
    Pour valider cette saisie lorsque je clique sur une ligne précédente ou suivante ma BDD Sql est bien Updatée et tout est parfait.
    Mais lorsque je n'ai qu'une ligne dans ma DATAGRIDVIEW je ne peux évidemment pas valider en cliquant sur une autre ligne, j'appuie donc sur la touche ENTREE de mon PC, la DATAGRIDVIEW montre bien la modification du champ mais ma BDD Sql n'est pas Updatée. J'ai essayé plein de choses sans succès, à défaut de clic sur une autre ligne la BDD Sql n'est pas Updatée.
    D'où ma question : y-a-il une méthode permettant de valider la modification d'un champ d'une DATAGRIDVIEW par la touche ENTREE ou autre action lorsqu'il n'y a qu'une seule ligne ?
    Merci d'avance

    Nom : DGV.jpg
Affichages : 338
Taille : 24,4 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub DataGridViewRdv_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridViewRdv.CellEndEdit
            If AdaptateurAgenda IsNot Nothing Then
                AdaptateurAgenda.Update(MonDataSet, "Agenda")
            End If
        End Sub

  2. #2
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 689
    Points : 994
    Points
    994
    Par défaut
    Bonjour,

    Le problème est simple.
    La valeur de la cellule n'est pas validée tant qu'on ne sort pas du champ.
    Il y a 2 solutions possibles :
    • Ajouter un bouton 'Enregistrer' sur le formulaire, et ne valider la BD que lors de l'appui sur ce bouton.
    • Utiliser l'évènement CurrentCellDirtyStateChanged pour forcer la fin d'édition du champ.

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    Bonjour et merci pour ta réponse
    Pour le bouton Enregistrer j'y ai bien pensé et même essayé mais je souhaitais l'éviter.
    Pour CurrentCellDirtyStateChanged j'ai tenté aussi mais que faut-il y mettre pour forcer la fin d'édition du champ ? Ce que j'ai essayé n'a pas été concluant ...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 689
    Points : 994
    Points
    994
    Par défaut
    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub maDataGridView_EndEditMode(sender As System.Object, e As EventArgs) Handles maDataGridView.CurrentCellDirtyStateChanged
     
            ' Si la cellule courante attend sa validation, on valide l'édition
            If maDataGridView.IsCurrentCellDirty Then
                maDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
     
        End Sub

  5. #5
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        Private Sub DataGridViewRdv_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridViewRdv.CellEndEdit
            If AdaptateurAgenda IsNot Nothing Then
                AdaptateurAgenda.Update(MonDataSet, "Agenda")
            End If
        End Sub
     
        Private Sub DataGridViewRdv__EndEditMode(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridViewRdv.CurrentCellDirtyStateChanged
            ' Si la cellule courante attend sa validation, on valide l'édition
            If DataGridViewRdv.IsCurrentCellDirty Then
                DataGridViewRdv.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
        End Sub
    Dans le cas d'une seule ligne l'update de la BDD ne se fait pas quelque soit la méthode employée pour valider (ENTREE, clic sur une cell adjacente ...)
    Par contre si ensuite je reclique sur la même cell pour l'éditer sans en changer le contenu et que je clique sur une cell adjacente pour valider l'Update fonctionne. Pas simple ...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 689
    Points : 994
    Points
    994
    Par défaut
    Attention, l'évènement CurrentCellDirtyStateChanged va se déclencher dès que tu touches à quoi que ce soit dans la cellule.
    Comme tu valides aussitôt, tu arrêtes l'édition et tu enregistres le contenu qui n'a pas encore changé en fait...

    J'avais simplifié le code. Quand on gère cet évènement il faut interagir avec l'évènement CellValueChanged en général.
    Personnellement je l'utilise pour faire du filtrage de saisie (champs purement numériques ou alphanumériques).

    Maintenant, je pense que j'étais fatigué quand j'ai répondu hier soir, la solution la plus simple est certainement de gérer çà dans l'évènement KeyPress.
    Quand la touche entrée est pressée ET qu'une cellule valide a été touchée (DataGridViewRdv.IsCurrentCellDirty...) tu valides l'édition (le CommitEdit) et la mise à jour se fera.

  7. #7
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    Merci encore de passer du temps à m'aider.
    Il semblerait que le KeyPress ne fonctionne plus et qu'il faille utiliser le KeyDown.
    Pour faire un test de fonctionnement j'ai ajouté cette Private Sub (avant de la compléter si l'appui de la touche ENTREE est détectée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub DataGridViewRdv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridViewRdv.KeyDown
            If e.KeyCode = Keys.Enter Then
                If MessageBox.Show("La touche ENTREE  a été appuyée", "La touche ENTREE  a été appuyée", MessageBoxButtons.OK, MessageBoxIcon.Error) = DialogResult.OK Then
                    Exit Sub
                End If
            End If
        End Sub
    Problème jamais cette Sub n'est jamais appelée ... Ai-je oublié quelque chose ?

  8. #8
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    Bon finalement j'ai un peu progressé. J'ai trouvé la solution pour que la touche F12 soit détectée dans KeyDown, la touche ENTREE n'était pas détectée.

    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
     
    Private Sub DataGridViewAgenda_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridViewAgenda.CellEndEdit
            If AdaptateurAgenda IsNot Nothing Then
                AdaptateurAgenda.Update(MonDataSet, "Agenda")
            End If
        End Sub
     
        Private Sub DataGridViewAgenda_EndEditMode(ByVal sender As System.Object, ByVal e As EventArgs) Handles DataGridViewAgenda.CurrentCellDirtyStateChanged
            ' Si la cellule courante attend sa validation, on valide l'édition
            If DataGridViewAgenda.IsCurrentCellDirty Then
                DataGridViewAgenda.CommitEdit(DataGridViewDataErrorContexts.Commit)
            End If
     
        End Sub
     
        Private Sub DataGridViewAgenda_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridViewAgenda.EditingControlShowing
            AddHandler e.Control.KeyDown, AddressOf cell_KeyDown
        End Sub
     
        Private Sub cell_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
            If e.KeyCode = Keys.F12 Then
                MessageBox.Show("Success")
            End If
        End Sub
    La MessageBox indique bien "Success". Reste maintenant à compléter le code pour faire ce que tu m'as dit :
    "Quand la touche F12 est pressée ET qu'une cellule valide a été touchée (DataGridViewRdv.IsCurrentCellDirty...) tu valides l'édition (le CommitEdit) et la mise à jour se fera. "
    Peux-tu me dire comment faire ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 689
    Points : 994
    Points
    994
    Par défaut
    C'est vrai que la touche Entrée est gérée séparément dans les DataGridView... Contrôle de l'interface oblige.
    C'est une touche qu'on ne peut intercepter, sauf à définir une classe dérivée du DataGridView gérant spécifiquement çà...

    Alors tu as presque tout (si tu veux utiliser F12... Moi franchement je mettrai un bouton de validation. C'est propre et surtout standard)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            If e.KeyCode = Keys.F12 Then
                If Not IsNothing(DataGridViewAgenda.CurrentCell) Then
                    If DataGridViewAgenda.IsCurrentCellDirty Then
                        DataGridViewAgenda.CommitEdit(DataGridViewDataErrorContexts.Commit)
                    End If
                End If
            End If
    Et détail supplémentaire à gérer avec ta méthode.
    Tu ajoutes un handler à chaque fois que tu entres en édition dans une cellule.
    Mais il faut le retirer ce handler ! Sinon ils vont s'empiler en mémoire (et les handler ne sont pas supprimés par le ménage automatique)
    Il va donc falloir en plus gérer le RemoveHandler, et çà va pas être simple.
    Quand l'effectuer ? A chaque fois qu'on quitte le champ, c'est sûr. Mais ce n'est surement pas le seul cas.
    Commet l'effectuer ? Tu ajoutes un handler avec e.Control.KeyDown mais tu vas avoir tu mal à le retirer avec ce même paramètre, e étant uniquement valable dans le sub où tu as ajouté le handler.

  10. #10
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 188
    Points
    17 188
    Par défaut
    Salut

    Citation Envoyé par m4k-Hurrican
    si tu veux utiliser F12... Moi franchement je mettrai un bouton de validation. C'est propre et surtout standard
    En effet, de plus en plus d'interfaces utilisateurs se font par écrans tactiles et autres téléphones mobile, c'est une bonne habitude de ne plus utiliser les boutons de fonction de nos vieux ordinateurs.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  11. #11
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2017
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2017
    Messages : 138
    Points : 77
    Points
    77
    Par défaut
    @m4k-Hurrican

    Je te remercie beaucoup pour ton aide, je voulais gérer ma DGV comme une feuille Excel mais je constate que c'est trop compliqué, je vais donc m'orienter vers l'ajout d'un bouton de validation rendu visible si ma DGV ne comporte qu'une seule ligne et quand il y en a plusieurs il suffit de cliquer sur une autre ligne pour valider et dans ce cas le bouton sera invisible.


    @ProgElecT Pas faux

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2014, 15h18
  2. [E-07] Valider une saisie dans un champ
    Par eliot.raymond dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 19/03/2009, 14h51
  3. [SQL] Compteur de saisies dans des champs d'une BDD
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/02/2007, 13h54
  4. brider une saisie dans le champ d'un formualire
    Par zeloutre dans le forum Access
    Réponses: 5
    Dernier message: 19/10/2006, 15h13
  5. Modification d'une combo suite à la saisi dans un champ texte
    Par GabriHell dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/05/2006, 17h48

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