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 :

datagridview.cellvaluechanged sur une partie du datagridview [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut datagridview.cellvaluechanged sur une partie du datagridview
    Bonjour à tous!
    alors, voilà, petite question, savez-vous si il est possible de faire un cellvaluechanged sur seulement une partie du datagridview?
    et si c'est possible, comment faire?

    merci d'avance!

  2. #2
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Bonjour,

    Cela n'est pas possible de base, tu devras implémenter l'évènement pour toute la datagrid et tester à l'intérieur si la cellule modifiée est dans la colonne que tu souhaites (ou la ligne).

    Si par exemple, tu veux une action uniquement si la cellule modifiée est dans la première colonne, cela donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub dgv_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellValueChanged
            If e.ColumnIndex = 0 Then
                'Ton traitement
            End If
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Gurdil le nain Voir le message
    Bonjour,

    Cela n'est pas possible de base, tu devras implémenter l'évènement pour toute la datagrid et tester à l'intérieur si la cellule modifiée est dans la colonne que tu souhaites (ou la ligne).

    Si par exemple, tu veux une action uniquement si la cellule modifiée est dans la première colonne, cela donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub dgv_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellValueChanged
            If e.ColumnIndex = 0 Then
                'Ton traitement
            End If
    End Sub
    donc il suffit que je rajoute ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If e.ColumnIndex = 0 Then
    pour lui demander de n'agir qu'en cas de modifs sur cette colonne (suivant l'exemple)... je teste ça de suite, merci!

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    merci énormément!
    cela fonctionne du tonnerre!!

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    euh, juste une question, est-il possible de ne le faire que pour la ligne active? parce que j'ai un fichier de +/- 250 lignes sur 34 colonnes de données à rentrer et c'est plutôt long de faire les calculs sur toutes les lignes à chaque fois (15-20sec sur un cpu E-350...)

    mon code:
    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
    Private Sub CellValueChanged(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) Handles PériodesDataGridView.CellValueChanged
     
            If e.ColumnIndex >= 3 AndAlso e.ColumnIndex <= 36 Then
                'compteur nombre de jours pour moyenne
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
                    Dim compt As Double
                    For Each cell As DataGridViewCell In row.Cells
                        If cell.ColumnIndex >= 3 AndAlso cell.ColumnIndex <= 36 Then
                            If Not IsDBNull(cell.Value) Then compt += 1
     
                        End If
     
                    Next
                    row.Cells(46).Value = compt
                    compt = 0
     
                Next
                'calcul de la moyenne
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
                    Dim total As Double
                    For Each cell As DataGridViewCell In row.Cells
                        If cell.ColumnIndex >= 3 AndAlso cell.ColumnIndex <= 36 Then
                            If Not IsDBNull(cell.Value) Then total += cell.Value
                        End If
                    Next
                    row.Cells(37).Value = total
                    row.Cells(38).Value = total / row.Cells(46).Value
                    total = 0
     
                Next
                'calcul de l'écart
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
     
                    For Each cell As DataGridViewCell In row.Cells
     
                        If IsDBNull(row.Cells(39).Value) Then
     
                            row.Cells(40).Value = 0
     
     
                        Else
                            row.Cells(40).Value = row.Cells(39).Value - row.Cells(37).Value
                        End If
                    Next
     
                Next
                'calcul du nombre de jours
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
     
                    For Each cell As DataGridViewCell In row.Cells
     
                        If IsDBNull(row.Cells(40).Value) Or IsDBNull(row.Cells(38).Value) Then
                            row.Cells(41).Value = ""
                        Else
                            row.Cells(41).Value = row.Cells(40).Value / row.Cells(38).Value
                        End If
     
                    Next
     
                Next
                'pour calcul ok depan
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
     
                    For Each cell As DataGridViewCell In row.Cells
     
                        If IsDBNull(row.Cells(40).Value) Then
                            row.Cells(45).Value = "pas de moyenne"
     
                        Else
     
                            row.Cells(45).Value = row.Cells(40).Value - (row.Cells(44).Value * row.Cells(38).Value)
     
                        End If
     
                    Next
     
                Next
                'affichage ok, dépannage
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
     
                    For Each cell As DataGridViewCell In row.Cells
     
                        If row.Cells(45).Value < 1 Then
                            row.Cells(42).Value = "Dépannage"
     
                            'ElseIf row.Cells(14).Value < TextBox1.Text + 2 And row.Cells(14).Value > TextBox1.Text Then
                            'row.Cells(15).Value = "attention"
                        Else
                            row.Cells(42).Value = "ok"
                        End If
                    Next
     
                Next
                'reste
                For Each row As DataGridViewRow In PériodesDataGridView.Rows
     
                    For Each cell As DataGridViewCell In row.Cells
     
                        row.Cells(43).Value = (row.Cells(40).Value - (row.Cells(44).Value * row.Cells(38).Value)) / 10
     
                    Next
     
                Next
     
            End If
     
        End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Points : 391
    Points
    391
    Par défaut
    Si tu veux mettre à jour le calcul seulement sur la ligne modifiée, travaille avec Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each row As DataGridViewRow In PériodesDataGridView.Rows
       (...)
    Next
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim  row As DataGridViewRow
    row =  PériodesDataGridView.Rows(e.RowIndex)
    (...)
    Ainsi tu ne traite que la ligne qui a subi une modification.
    En mode lecture/écriture.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    merci mais j'ai un petit soucis:
    Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
    mon code ( que j'ai simplifié à une opération pour voir si c'est de là que venait le problème...:
    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
        Private Sub CellValueChanged(ByVal sender As Object, _
       ByVal e As DataGridViewCellEventArgs) Handles PériodesDataGridView.CellValueChanged
     
            If e.ColumnIndex >= 3 AndAlso e.ColumnIndex <= 36 Then
                'compteur nombre de jours pour moyenne
                Dim row As DataGridViewRow
                row = PériodesDataGridView.Rows(e.RowIndex)
                Dim compt As Double
                For Each cell As DataGridViewCell In row.Cells
                    If cell.ColumnIndex >= 3 AndAlso cell.ColumnIndex <= 36 Then
                        If Not IsDBNull(cell.Value) Then compt += 1
     
                    End If
     
                Next
                row.Cells(46).Value = compt
                compt = 0
     
            End If
     
     
     
        End Sub
    je pense que le problème vient de e.RowIndex mais je n'arrive pas à savoir pourquoi...

    merci!

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PériodesDataGridView(e.ColumnIndex,e.RowIndex)
    te donnes même la cellule active

    Par contre tu devrais utiliser le nom de tes colonnes pour les identifier plutôt que leur index, parce que si tu décides de mettre une colonne supplémentaire au milieu de ton tableau, à l'index 20 par exemple, tu seras obliger de modifier tout ton code...

    Exemple:

    change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    row.Cells(37).Value = total
    row.Cells(38).Value = total / row.Cells(46).Value
    En:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    row.Cells("nomDeLaColonne37").Value = total
    row.Cells("nomDeLaColonne38").Value = total / row.Cells("nomDeLaColonne46").Value

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    merci shadam mais cela ne fonctionne pas, je cherche à travailler sur la ligne de la cellule active et avec ton code, c'est uniquement la cellule en cours non?
    ou alors il me faudrait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row= datagridview.rows(datagridviewindex(e.columnindex, e.rowindex))
    ...
    mais, biensûr, cela ne fonctionne pas
    pour le nom au lieu de l'index, c'est vrai que je risque de le regretter si je laisse l'index... merci!

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    Le bout de code que je t'ai mis te montrait juste que tu avais le rowIndex et le columnIndex dans l'évènement (tu l'as d'ailleurs sur quasiment tout les évènements d'un DGV).

    Par contre oui je te conseille très vivement de ne pas référencer tes colonnes par leur index mais plutôt par leur prénom sous peine de longues modifications de codes (et je parle d'expérience ), personnellement je le fais dés que c'est possible, sur les datareader par exemple: reader.item("monItem"), puisque dans ce cas là le problème est le même, si des champs sont rajoutés sur les tables en base, au moins en les nommant je suis sûr que mon appli récupérera toujours les bons...

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par ozthewizard Voir le message
    merci shadam mais cela ne fonctionne pas, je cherche à travailler sur la ligne de la cellule active et avec ton code, c'est uniquement la cellule en cours non?
    ou alors il me faudrait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row= datagridview.rows(datagridviewindex(e.columnindex, e.rowindex))
    ...
    mais, biensûr, cela ne fonctionne pas
    pour le nom au lieu de l'index, c'est vrai que je risque de le regretter si je laisse l'index... merci!
    j'ai fait un test en rajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If e.RowIndex = -1 Then
                    Return
                End If
    je n'ai plus le message d'erreur mais il ne calcule plus du tout...

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    Return est une instruction de retour pour sortir il faut mettre Exit Sub. Un rowIndex de -1 c'est les columnsHeader...

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    corrigé pour le return, pour l'index -1, je savais
    mais le message d'erreur me dit que l'index est soit négatif soit supérieur à la collection...
    en fait, on dirait qu'il fait le code de cellchanged avant que le form ne se lance, et vu que la BDD est vide, je ne comprends pas pourquoi est ce qu'il me fait une erreur...

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    A ce moment là il faut que tu testes si tu as des lignes dans ton dataGrid avant toute autre instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If taDGV.RowCount > 0 Then

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Shadam Voir le message
    A ce moment là il faut que tu testes si tu as des lignes dans ton dataGrid avant toute autre instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If taDGV.RowCount > 0 Then
    ça marche!
    merci!
    mais comment cela-se fesse? je pensais que le code ne se lancerait que en cas de changement mais apparement, il travaille déjà avant?

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    lorsque ta DataGrid se dessine elle crée tes columnsHeader et du coup déclenche le cellValueChanged

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    et a ce moment la, mon if index =-1 est inefficace... ok!
    merci beaucoup!!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/03/2013, 13h29
  2. Evénement sur une cellule de DataGridView
    Par sepullayer dans le forum C++/CLI
    Réponses: 2
    Dernier message: 27/03/2009, 15h52
  3. Lier le comportement de 2 combobox sur une ligne de datagridview
    Par Delphi-ne dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/03/2009, 16h03
  4. Réponses: 5
    Dernier message: 06/09/2005, 16h01
  5. Changement de couleur de police sur une partie d'un caption
    Par kobe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/07/2005, 10h18

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