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 :

Gestion focus dans un datagrid


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut Gestion focus dans un datagrid
    Bonjour à tous,

    Voici mon problème :

    Je fais de l'encodage dans une colonne précise d'un datagrid et je fais un test de valeur de cette colonne qui ne peut dépasser un maximum ... Si ce maximum est dépassé, je souhaite garder le focus sur la même colonne dans la même ligne ... pour empêcher la saisie de l'info suivante ....
    Voici les code utilisé :

    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
     Private Sub dgvPointsTmp3_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvPointsTmp3.CellValueChanged
            Dim Test As Integer = dgvPointsTmp3.Rows(e.RowIndex).Cells(8).Value
            Dim Max As Integer = dgvPointsTmp3.Rows(e.RowIndex).Cells(9).Value
     
            Select Case Test
                Case 0
                    Dim result As DialogResult = MessageBox.Show("Eleve absent ?", "Attention !", MessageBoxButtons.YesNo)
                    If result = DialogResult.Yes Then
                        dgvPointsTmp3.Rows(e.RowIndex).Cells(10).Value = True
                        Exit Sub
                    Else
                        Exit Select
                    End If
                    dgvPointsTmp3.Update()
                Case > Max
                    MessageBox.Show("Cote erronée > '" & Max & "'", "Attention !")
                    Dim rowNumber As Integer = (e.RowIndex + 1)
                    Dim cellNumber As Integer = 8
                    dgvPointsTmp3.CurrentCell = dgvPointsTmp3(cellNumber, rowNumber)
                    Exit Select
            End Select
        End Sub
    En cas de dépassement du maximum, après affichage de la messagebox, le focus est donné à la bonne cellule mais dans la ligne suivante ...

    Quelqu'un a-t'il une idée pour résoudre le problème ???

    D'avance, merci

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    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 : 726
    Par défaut
    Bonjour,
    Euh... Peut-être parce que tu as mis cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim rowNumber As Integer = (e.RowIndex + 1)

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    A priori, tu veux valider la valeur de la cellule et garder le focus si cette valeur n'est pas valide.

    La grille possède un événement pour ça.
    https://docs.microsoft.com/fr-fr/dot...tframework-4.8

    puis

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut
    Citation Envoyé par m4k-Hurrican Voir le message
    Bonjour,
    Euh... Peut-être parce que tu as mis cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim rowNumber As Integer = (e.RowIndex + 1)
    Merci de la réponse mais cela ne solutionne pas mon problème de maintien du pointeur dans la cellule testée ...

    Par défaut, e.Rowindex de la première ligne renvoie 0 et que j'utilise cette valeur ou cette valeur +1 le pointeur se déplace toujours sur la même cellule, row suivante ...

  5. #5
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Citation Envoyé par gebraq Voir le message
    ... Si ce maximum est dépassé, je souhaite garder le focus sur la même colonne dans la même ligne ... pour empêcher la saisie de l'info suivante ....
    Bonjour,

    Si j'ai bien compris ton problème : Il me semble qu'il te faut créer un algorithme de test pour vérifier si tu sort de ta matrice de ton grid. Si c'est le cas il faut affecter d'office un valeur ad'hoc 'valeur maximum bordure' . Du coup ta case 'butoir' aura le focus.

    Si cela passe quand même à la ligne suivante test avec une valeur de 'butoir' moins 1.

    Si cela peut t'aider.

  6. #6
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    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 : 726
    Par défaut
    Citation Envoyé par gebraq Voir le message
    Par défaut, e.Rowindex de la première ligne renvoie 0 et que j'utilise cette valeur ou cette valeur +1 le pointeur se déplace toujours sur la même cellule, row suivante ...
    Pourtant, c'est e.RowIndex qu'il faut que tu utilises, et il faut aussi que tu entres en édition sur la cellule concernée juste après avoir pointé dessus, en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgvPointsTmp3.BeginEdit(True)
    Par ailleurs, pointer sur une colonne avec son n° n'est pas forcément une bonne chose (réorganisation de colonnes par l'utilisateur ou le développeur, insertion de colonnes, etc...).
    Utilises plutôt le nom de la colonne, dans ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgvPointsTmp3.CurrentCell = dgvPointsTmp3.Item("nom_De_La_Colonne", e.RowIndex)
    Maintenant, cette méthode est surtout utilisée lorsqu'on désire placer le curseur sur une cellule différente (cas de champs liés).
    Dans le cas d'une validation simple de valeur, comme l'a indiqué Popo, il vaut peut être mieux utiliser les évènements dédiés à la validation.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut windows.forms.datagridview.cellvalidating
    Citation Envoyé par popo Voir le message
    A priori, tu veux valider la valeur de la cellule et garder le focus si cette valeur n'est pas valide.

    La grille possède un événement pour ça.
    https://docs.microsoft.com/fr-fr/dot...tframework-4.8

    puis
    Bonjour Popo,
    suite à votre conseil, j'ai gambergé sur "datagridview.cellvalidating" mais sans succès : le pointeur d'écriture se déplace toujours sur la row suivante ...
    Voici le code utilisé :

    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
     
      Private Sub dgvPointsTmp3_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgvPointsTmp3.CellValidating
     
            Dim Max As String = dgvPointsTmp3.Rows(e.RowIndex).Cells(9).Value.ToString
            Dim rownuber1 As Integer = (e.RowIndex)
     
            If dgvPointsTmp3.CurrentCell.ColumnIndex = 8 Then
     
                If dgvPointsTmp3.Rows(rownuber1).Cells(8).FormattedValue > Max Then
                    MessageBox.Show(dgvPointsTmp3.Rows(e.RowIndex).ErrorText = "La cotation dépasse le maximum")
     
                    e.Cancel = True
                End If
            End If
        End Sub
    plus images du résultat et du debugging

    Nom : datagrid.jpg
Affichages : 426
Taille : 64,4 Ko
    Nom : debug-1.jpg
Affichages : 431
Taille : 11,9 Ko
    Nom : debug-2.jpg
Affichages : 429
Taille : 13,7 Ko

    Dans ce cas, le test "If dgvPointsTmp3.Rows(rownuber1).Cells(8).FormattedValue" n'est jamais validé !!!
    Une autre idée ???

  8. #8
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    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 : 726
    Par défaut
    Il faut que tu utilises les valeurs transmises dans l'évènement, pas d'autres valeurs déjà.

    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dgvPointsTmp3.CurrentCell.ColumnIndex = 8 Then
    Ne devrait pas utiliser dgvPointsTmp3.CurrentCell.ColumnIndex, mais simplement e.ColumnIndex

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut
    Citation Envoyé par m4k-Hurrican Voir le message
    Il faut que tu utilises les valeurs transmises dans l'évènement, pas d'autres valeurs déjà.

    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dgvPointsTmp3.CurrentCell.ColumnIndex = 8 Then
    Ne devrait pas utiliser dgvPointsTmp3.CurrentCell.ColumnIndex, mais simplement e.ColumnIndex
    Merci à tous pour vos conseils ...
    J'ai trouvé la solution et voici le code utilisé :
    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
    Private Sub dgvPointsTmp3_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgvPointsTmp3.CellValidating
     
            Dim Max As String = dgvPointsTmp3.Rows(e.RowIndex).Cells(9).Value.ToString
            Dim rownuber1 As Integer = (e.RowIndex)
     
            If dgvPointsTmp3.CurrentCell.ColumnIndex = 8 Then
     
                If dgvPointsTmp3.Rows(rownuber1).Cells(8).EditedFormattedValue > Max Then
                    MessageBox.Show(dgvPointsTmp3.Rows(e.RowIndex).ErrorText = "La cotation dépasse le maximum")
     
                    e.Cancel = True
                End If
            End If
        End Sub
    En fait c'était évident : seul "EditedFormatedValue" renvoie la dernière valeur saisie dans la cellule testée ... (Évident mon cher Watson !!!)

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Citation Envoyé par gebraq Voir le message
    En fait c'était évident : seul "EditedFormatedValue" renvoie la dernière valeur saisie dans la cellule testée ... (Évident mon cher Watson !!!)
    En fait non,
    Mon cher Watson, m4k-Hurrican t'as déjà fait cette remarque que je me contenterai de citer :
    Citation Envoyé par m4k-Hurrican Voir le message
    Il faut que tu utilises les valeurs transmises dans l'évènement, pas d'autres valeurs déjà.
    Et si tu regardes de plus près l'objet transmis dans l'événement, il possède une propriété FormattedValue, qui renvoie la valeur à valider.
    https://docs.microsoft.com/fr-fr/dot...formattedvalue
    Citation Envoyé par MSDN
    Obtient le contenu mis en forme de la cellule à valider
    Donc simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If e.FormattedValue > Max Then
       e.Cancel = True
    End If

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut
    Citation Envoyé par popo Voir le message
    En fait non,
    Mon cher Watson, m4k-Hurrican t'as déjà fait cette remarque que je me contenterai de citer :


    Et si tu regardes de plus près l'objet transmis dans l'événement, il possède une propriété FormattedValue, qui renvoie la valeur à valider.
    https://docs.microsoft.com/fr-fr/dot...formattedvalue


    Donc simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If e.FormattedValue > Max Then
       e.Cancel = True
    End If
    Résolu grâce à vos précieux conseils.
    Grand merci à vous tous !

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

Discussions similaires

  1. Gestion du focus dans une hiérarchie de contrôles
    Par JolyLoic dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 29/08/2009, 15h44
  2. gestion de la perte de focus dans un TEdit
    Par PtiteDéveloppeuse dans le forum Composants VCL
    Réponses: 19
    Dernier message: 07/04/2008, 14h41
  3. Gestion du focus dans des textbox
    Par noremo2010 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/10/2007, 08h42
  4. Gestion des couleurs dans un datagrid
    Par edophie dans le forum Flash
    Réponses: 4
    Dernier message: 07/11/2006, 11h08
  5. Réponses: 5
    Dernier message: 04/05/2006, 17h00

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