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 :

Problème : couleur de cellule dans un datagrid


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut Problème : couleur de cellule dans un datagrid
    Bonjour,

    Je cherche à changer la couleur d'une cellule d'un datagrid en fonction du contenu d'une autre cellule.

    Mon datagrid est rempli de manière automatique via une datatable.

    Une fois le datagrid rempli, j'ai une fonction qui lit chaque ligne et est censée changer la couleur de ma cellule :

    Note : backChiffrage, foreChiffrage etc... sont des objets de type color définis ailleurs.

    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
     
    Dim i As Integer
    For i = 0 To dgvBilanAffaire.Rows.Count - 1
       Select Case dgvBilanAffaire.Item("dcestatut", i).Value.ToString
          Case "Chiffrage"
             dgvBilanAffaire.Rows(i).Cells(2).Style.BackColor = backChiffrage
             dgvBilanAffaire.Rows(i).Cells(2).Style.ForeColor = foreChiffrage
          Case "Lancée"
             dgvBilanAffaire.Rows(i).Cells(2).Style.BackColor = backLancee
             dgvBilanAffaire.Rows(i).Cells(2).Style.ForeColor = foreLancee
          Case "Validée"
             dgvBilanAffaire.Rows(i).Cells(2).Style.BackColor = backValidee
             dgvBilanAffaire.Rows(i).Cells(2).Style.ForeColor = foreValidee
          Case "Annulée"
             dgvBilanAffaire.Rows(i).Cells(2).Style.BackColor = backAnnulee
             dgvBilanAffaire.Rows(i).Cells(2).Style.ForeColor = foreAnnulee
       End Select
    Next
    Problème :

    Ca ne marche pas ! Mes cellules restent blanches.

    J'ai essayé de caser un dgvBilanAffaire.refresh() à la fin de ma boucle, dans ce cas, je vois les couleurs apparaître puis revenir à blanc une fois le tableau entièrement dessiné.

    Une idée ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Bonjour,

    Moi quand je change la coleur d'une cellule je fais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TotoDataGridView.Item(2, i).Style.BackColor = Color.Red
    Je suis pas sûr que ça t'aide, mais chez moi ca marche. D'ailleurs, pour être honnete je ne comrend pas trop pourquoi ton code ne marche pas car il me semble que tu accede au meme objet que moi mais d'une autre facon.
    Es-tu sûr qu'il n'y a pas un Fill ou autre qui reremplit ta table apres modification de la couleur?

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut
    J'ai remplacé mes

    dgvBilanAffaire.Rows(i).Cells(2).Style.BackColor = backChiffrage

    par des

    dgvBilanAffaire.Item(2,i).Style.Backcolor = backChiffrage

    Le problème reste le même.

    Je n'arrive pas à comprendre. Rien après ma boucle n'intervient plus sur ma datagrid.
    Voici comment je la génère :

    (on suppose que donneesDCE est un DataTable valide)

    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
     
    With dgvBilanAffaire
       .DataSource = donneesDCE
     
       'la colonne projet-affaire est masquée
       .Columns(0).Visible = False
       'la colonne projet-affaire est masquée
       .Columns(1).Visible = False
     
       'affectation des styles
       .Columns(3).DefaultCellStyle = StyleNumerique
       .Columns(4).DefaultCellStyle = StyleNumerique
       .Columns(5).DefaultCellStyle = StyleNumerique
       .Columns(6).DefaultCellStyle = StyleNumerique
     
       ' Largeur des colonnes
       .Columns(2).Width = 40
       .Columns(3).Width = 141
       .Columns(4).Width = 141
       .Columns(5).Width = 141
       .Columns(6).Width = 141
     
    End With
     
    (C'est ici que je lance ma boucle de colorisation des cellules)
    En désactivant la partie des affectations de style, ça ne change rien au problème.
    En remplaçant mes variables foreChiffrage, backChiffrage etc... par des couleurs en dur style Color.Orange, ça ne change rien non plus.

    Je me demande s'il n'y a pas une propriété de mon DataGrid qui empêche la recolorisation des cellules après coup.
    Mais je ne vois vraiment pas laquelle...

    J'essaie de rester calme...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 71
    Points
    71
    Par défaut
    peut etre une piste : il y a (surement) un évenement RowAdd ou RowFormating ou bien encore RowPaint ... déclenché pendant le remplissage du datagrid et peut etre dans une de ces procédure d'évenement qu'il convient de placer l'action de repeindre une couleur de ligne (ou cellule)...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut
    J'avais déjà exploré cette piste, sans trouver l'évènement en question.

    Je vais quand même réessayer de trouver le bon évènement.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 80
    Points : 89
    Points
    89
    Par défaut
    Question stupide : Es-tu certain qu'il passe dans l'une des conditions de ton select ? Car ça fait maintenant 3 mois que je travaille intensivement avec des DataGridView et j'ai fais cette manipulation des dizaines de fois sans problème.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut
    (Ce n'est pas une question stupide)

    Malheureusement, oui, il passe bien dans mon Select.

    Et ta question me confirme un truc énervant : en plaçant un MessageBox.Show() à chaque Case de mon Select, je vois ma cellule coloriée comme je le veux, sauf qu'une fois arrivé en fin de tableau, tout repasse en blanc.

    Je viens d'exécuter tout le code en pas à pas au debuggeur, il ne se passe rien après le load() de mon formulaire qui lance cette fameuse boucle.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Essaye plus un code comme ça pour voir :

    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
    dim i as integer
    For Each Ligne As EssaiDataSet.TableTestRow In Me.EssaiDataSet.TableTest.Rows
                i += 1
                Select Case Ligne("Test3").ToString
                    Case "AAA1"
                        DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Coral
                    Case "AAA2"
                        DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Red
                    Case "AAA3"
                        DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Aqua
                    Case "AAA4"
                        DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Brown
                End Select
    
            Next
    Moi j'ai essayé chez moi, ça marche nickel

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut
    Ok, ton idée est donc de parcourir le DataTable au lieu du DataGrid.

    J'ai fait l'essai, ... même résultat.

    Et toujours le même phénomène : si je mets un MessageBox.Show() entre chaque passage dans la boucle, la couleur change bien, puis redevient blanche à la fin.

    Mais merci pour l'idée.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Points : 48
    Points
    48
    Par défaut
    Ca y'est !!

    Pifou25 m'avait suggéré de me tourner vers les évènements du DataGrid : bonne idée, il faut utiliser le Row_PostPaint()

    Voici mon code, pour ceux que ça pourrait intéresser :

    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
     
    Private Sub dgvBilanAffaire_RowPostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles dgvBilanAffaire.RowPostPaint
     
    ' Déclaration de 2 objets cellule :
    ' L'un contient la valeur à tester
    ' L'autre la cellule à colorer
    Dim celluleDCE, celluleDCEStatut As DataGridViewCell
     
    celluleDCEStatut = dgvBilanAffaire.Item(1, e.RowIndex)
    celluleDCE = dgvBilanAffaire.Item(2, e.RowIndex)
     
    ' Le test en lui-même
    Select Case celluleDCEStatut.Value.ToString
       Case "Chiffrage"
          celluleDCE.Style.BackColor = backChiffrage
          celluleDCE.Style.ForeColor = foreChiffrage
       Case "Validée"
          celluleDCE.Style.BackColor = backValidee
          celluleDCE.Style.ForeColor = foreValidee
     
    (etc...)
     
    End Select
     
    End Sub
    Merci beaucoup à tous !

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

Discussions similaires

  1. changer couleur d'une cellule dans un datagrid
    Par megaloplex dans le forum Flex
    Réponses: 7
    Dernier message: 11/06/2009, 14h33
  2. problème de couleur de cellule dans une JTable
    Par rprom1 dans le forum Composants
    Réponses: 3
    Dernier message: 04/04/2007, 00h01
  3. [C# 1.1] Mise à jour cellules dans un datagrid
    Par celos dans le forum Windows Forms
    Réponses: 10
    Dernier message: 14/06/2006, 09h26
  4. Réponses: 5
    Dernier message: 04/05/2006, 17h00
  5. [VBA] problème choix de cellule dans feuille excel
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/02/2006, 10h48

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