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 :

[VB.Net] Comment empêcher le changement de ligne automatique d'un DataGridView


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [VB.Net] Comment empêcher le changement de ligne automatique d'un DataGridView
    Bonjour
    Voici mon problème.

    Lorce que je modifie le contenue d'une cellule de ma DataGridView, ca change de ligne après avoir appuyer sur ENTER.


    J'ai regardé du coté de ses propriétés mais je n'ai rien trouver.
    J'ai aussi essayé de sélectionner la cellule de droite à l'aide de l'évènement Grd_CellEndEdit, mais sans succès.

    Comment puis-je empêcher ca?

    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
    Il faut détecter l'évènement KeyDown du DatagridView, et faire un teste sur la touche appuyée.

    En fonction du résultat, tu feras ce que tu veux.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    il me semble même que ton datagridview à une fonction CellEnter

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    J'ai déjà essayer KeyDown et CellEnter. Mais ca n'empeiche pas le changement de cellule automatique.

    Autre chose à proposer?

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Utiliser la touche Tab plutôt que la touche Enter pour passer à la cellule d'à côté ? (comme dans Excel en fait)

    Ou tu veux juste valider la cellule sans passer à la suivante ?
    Kropernic

  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
    Citation Envoyé par number7 Voir le message
    J'ai déjà essayer KeyDown et CellEnter. Mais ca n'empeiche pas le changement de cellule automatique.

    Autre chose à proposer?
    Il aurait été plus utile de nous montrer le code qui "ne fonctionne pas".

    Bon, j'ai fais un petit test, et ça ça marche (ca annule l'action du Enter, mais en soit, mon code ne fait rien d'autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
     
            If e.KeyCode = Keys.Enter Then
     
                e.Handled = True
     
            End If
     
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    la touche Tab est dédié pour passer à la cellule de droite, avec le DGV Windows Form.
    Mais c'est pratique aussi d'avoir le Return, pour la même fonction, surtout avec le pavé numérique.
    Une possibilité est la personnalisation de ce contrôle.
    Ça foisonne sur le net, genre :
    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
        Public Class CustomDataGridView
     
            Inherits Windows.Forms.DataGridView
     
            Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
     
                If keyData = Keys.Enter Then
                    Dim row As Integer = Me.CurrentCell.RowIndex, column As Integer = Me.CurrentCell.ColumnIndex
     
                    column += 1
                    If column = Me.ColumnCount Then
                        row += 1
                        If row = Me.Rows.Count Then
                            Dim dr As DataRowView = CType(Form1.bindingSource1.AddNew, DataRowView)
                        End If
                        column = 0
                    End If
     
                    Me.CurrentCell = Me.Rows(row).Cells(column)
     
                    If Not Me.IsCurrentCellInEditMode Then
                        Return True
                    End If
                End If
                Return MyBase.ProcessCmdKey(msg, keyData)
            End Function
     
        End Class

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    Dans le cas où l'on veut garder son DGV WinForm standard, en bidouillant un peu, c'est possible aussi.
    Pour le passage d'une cellule vers celle de droite, sans entrer en mode édition c'est facile, en s'inspirant du code du contrôle personnalisé ci dessus :
    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
        Dim row As Integer
        Dim column As Integer
     
        Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
     
            If e.KeyCode = Keys.Enter Then
                ' Lorsque l'on valide une cellule en mode NON édition, on passe à la cellule suivante sur la même ligne, 
                ' ou à la 1ère cellule de la ligne suivante si la cellule est la dernière de la ligne en cours.
                ' Avec création d'une nouvelle ligne si cette ligne est la dernière.
                row = DataGridView1.CurrentCell.RowIndex
                column = DataGridView1.CurrentCell.ColumnIndex
                column += 1
                If column = DataGridView1.ColumnCount Then
                    row += 1
                    If row = DataGridView1.Rows.Count Then
                        If row = DataGridView1.RowCount Then
                            If DataGridView1.DataSource IsNot Nothing Then
                                bindingSource1.AddNew()
                            Else
                                DataGridView1.Rows.Add()
                            End If
                        End If
                    End If
                    column = 0
                End If
     
                DataGridView1.CurrentCell = DataGridView1.Rows(row).Cells(column)
     
                ' Arrivant en fin de ligne, par defaut Enter crée une nouvelle ligne, mais vu qu'elle a déjà été
                ' créée par programmation, nous indiquons que l'événement a été géré.
                e.Handled = True
            End If
     
        End Sub
    Mais si on entre dans une cellule pour y mettre une valeur (c'est quand même le but), le contrôle, en mode édition, passe à la cellule de dessous, ignorant l'événement KeyDown.
    En y regardant de plus près, on constate que l'événement SelectionChanged est traité avant.
    Il suffit donc de savoir si le DGV est en mode édition et d'agir sur SelectionChanged, en complétant le code ci dessus avec celui ci :
    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
        Dim modeEdition As Boolean
     
        Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
            modeEdition = True
        End Sub
     
        Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.SelectionChanged
     
            If modeEdition = True Then
                row = DataGridView1.CurrentCell.RowIndex
                column = DataGridView1.CurrentCell.ColumnIndex
                column += 1
                If column = DataGridView1.ColumnCount Then
                    row += 1
                    column = 0
                End If
                DataGridView1.CurrentCell = DataGridView1.Rows(row - 1).Cells(column)
                modeEdition = False
            End If
     
        End Sub

Discussions similaires

  1. [Vb.Net] Comment obtenir le nombre de ligne(s) d'un DataGrid ?
    Par dinbougre dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2007, 12h25
  2. Réponses: 2
    Dernier message: 11/07/2006, 10h34
  3. Réponses: 10
    Dernier message: 06/07/2006, 10h29

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