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 :

DataGridViewRow.DefaultCellStyle.BackColor : le changement de couleur ne se fait pas


Sujet :

VB.NET

  1. #1
    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 DataGridViewRow.DefaultCellStyle.BackColor : le changement de couleur ne se fait pas
    Hello,

    Sur un formulaire, j'ai 2 DataGridView avec chacun leur propre contenu. Il y a juste 2 colonnes identiques entre les deux. Une nommée "dgvcListType" contenant un String ou Nothing et une autre nommée "dgvcBrowse" contenant un bouton.

    Si la colonne dgvcListType vaut Nothing, alors la ligne doit être colorée et le bouton doit être désactivé. Cela fonctionne très bien pour un DataGridView mais pas du tout pour l'autre et je m'en arrache les poils du menton... (pour le peu que j'ai en plus )

    Ci-dessous, les deux procédures gérant le changement de couleur des lignes. La première fait son job mais, apparemment, pas la seconde.
    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
        Private Sub dgvPromoDetailDemo_DataSourceChanged(sender As Object, e As EventArgs) Handles dgvPromoDetailDemo.DataSourceChanged
            For Each row As DataGridViewRow In dgvPromoDetailDemo.Rows
                If row.Cells("dgvcListType").Value Is Nothing Then
                    row.DefaultCellStyle.BackColor = Color.LightGreen
                    CType(row.Cells("dgvcBrowse"), DataGridViewDisableButtonCell).Enabled = False
                End If
            Next
        End Sub
     
        Private Sub dgvPromoDetailOwn_DataSourceChanged(sender As Object, e As EventArgs) Handles dgvPromoDetailOwn.DataSourceChanged
            For Each row As DataGridViewRow In dgvPromoDetailOwn.Rows
                If row.Cells("dgvcListType").Value Is Nothing Then
                    row.DefaultCellStyle.BackColor = Color.LightGreen
                    CType(row.Cells("dgvcBrowse"), DataGridViewDisableButtonCell).Enabled = False
                End If
            Next
        End Sub
    J'ai fait du debug pas à pas et ça on passe bien, lors de l'affectation de la propriété DataSource, dans la (2e) procédure.
    Je ne comprends donc pas pourquoi les lignes ne sont pas mises en vert clair...

    Voici l'affectation des propriétés DataSource des deux DataGridView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub DisplayDemos()
            Me.dgvPromoDetailDemo.DataSource = Me.Promo.DTO.DetailsDemo
        End Sub
     
        Private Sub DisplayOwns()
            Me.Promo.DTO.DetailsOwn = Me.Promo.DTO.DetailsOwn.OrderBy(Function(x) x.Department.Code).ThenBy(Function(x) x.Brand.Code).ThenBy(Function(x) x.SeasonsRange).ToList
            Me.dgvPromoDetailOwn.DataSource = Me.Promo.DTO.DetailsOwn
        End Sub
    Y a-t-il quelque chose de suspect ?

    Si quelqu'un avait ne fut-ce qu'une piste, ça m'avancerait.

    Merci d'avance.
    Kropernic

  2. #2
    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 j'ai oublié de préciser
    En fait, même le bouton n'est pas désactivé.

    C'est comme si la procédure ne faisait rien du tout au final.

    Actuellement, j'essaie de voir s'il y a une différence entre les deux DataGridView au niveau du designer.
    Dans le code, je fais identiquement la même chose pour les deux à l'exception de l'initialisation des colonnes évidemment.
    Kropernic

  3. #3
    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 j'ai fait une découverte
    Hello,

    Je viens de découvrir que cela est lié au TabControl qui les contient. Je n'en ai pas parlé jusqu'ici car je ne pensais pas qu'il entrait dans l'équation mais les DataGridView sont contenu dans un TabControl et chacun dans un TabPage différent.

    En fait, il n'y a que le DataGridView contenu dans le TabPage d'index 0 qui voit ses lignes colorisées.

    Reste à savoir pourquoi !

    EDIT : Je peux contourner le problème en appelant les Sub DisplayDemos et DisplayOwns dans l'event SelectedIndexChanged du TabControl en fonction de l'index qui est sélectionné mais c'est quand même assez moche...
    Kropernic

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Pouvez vous essayer d'attribuer la même source de données aux deux DGV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Me.dgvPromoDetailDemo.DataSource = Me.Promo.DTO.DetailsDemo
     
    'Me.dgvPromoDetailOwn.DataSource = Me.Promo.DTO.DetailsOwn
    Me.dgvPromoDetailOwn.DataSource = Me.Promo.DTO.DetailsDemo
    pour tester?
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  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 C'est testé !
    Voilà c'est testé et le comportement est le même.

    Comme précisé dans mon précédent message (vous l'avez p-e raté), le problème est dû au fait que, pour une raison que j'ignore, le DataGridView qui se ne trouve pas dans le TabPage affiché à l'ouverture du formulaire doit subir un traitement qui fait qu'il perd le style appliqué à ses lignes.

    Je cherche maintenant à savoir pourquoi histoire de pouvoir corriger le problème (je n'aime pas les contournements).
    Kropernic

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Est ce que vous pouvez donner le nom des colonnes des deux DGV ?
    Dans vos procédures, vous utilisez les mêmes noms de colonnes mais dans deux dgv différents. Or, il me semble que le nom des colonnes doit être unique.

    EDIT: J'ai fait un petit essai. Si l'on fait appel à un nom de colonne qui n'existe pas dans le DGV cible, il sort directement de la procédure sans aucune erreur.
    Dans votre cas, je présume que votre colonne "dgvcListeType" n'existe que dans le dgv "dgvPromoDetailDemo". Dans l'autre dgv, la colonne doit porter un autre nom.

    Sur un formulaire, j'ai placé un tabcontrol, deux tabpages avec un dgv dans chaque tabpage.

    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
     
    Public Class Form1
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.DataGridView1.BackgroundColor = Color.AliceBlue
            Me.DataGridView2.BackgroundColor = Color.Beige
            AddLines(Me.DataGridView1)
            AddLines(Me.DataGridView2)
            ChangeStyle(Me.DataGridView1)
            ChangeStyleDGV2(Me.DataGridView2)
        End Sub
     
        Public Sub AddLines(ByVal dgv As DataGridView)
            For i As Integer = 0 To 5
                Dim _row As New DataGridViewRow
                dgv.Rows.Add(_row)
            Next
        End Sub
     
        Public Sub ChangeStyle(ByVal dgv As DataGridView)
            For Each _row As DataGridViewRow In dgv.Rows
                If _row.Cells("Column1").Value Is Nothing Then
                    _row.DefaultCellStyle.BackColor = Color.Red
                End If
            Next
        End Sub
        Public Sub ChangeStyleDGV2(ByVal dgv As DataGridView)
            For Each _row As DataGridViewRow In dgv.Rows
                If _row.Cells("Column2").Value Is Nothing Then 'Si on remplace Column2 par Column1 (qui n'existe pas dans DataGridView2), on a exactement le comportement que vous décrivez
                    _row.DefaultCellStyle.BackColor = Color.Red
                End If
            Next
        End Sub
    End Class
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  7. #7
    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
    Quelques petites pistes :

    1) Tu dis avoir avancé au pas-à-pas, confirmes tu que le code se rends bien dans la boucle et "applique" le changement de couleur ? Pas d'exception?

    2) N'aurais tu pas d'autres événements lié au DGV qui pourraient interférer ?

    3) Juste au cas, où, j'ai déjà lu quelque part, avec les TabPage qu'il faille qu'il soit sélectionné pour prendre en compte les modifications visuels.
    Donc tu pourrais tester, dans chacun des événements des DataSourceChange une petite ligne pour mettre au premier plan le tabpage concerné.
    Si c'est ça, après tu pourras toujours masquer ce changement de Tabpage pour que se soit invisible.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  8. #8
    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
    Citation Envoyé par Rainui Voir le message
    Est ce que vous pouvez donner le nom des colonnes des deux DGV ?
    Dans vos procédures, vous utilisez les mêmes noms de colonnes mais dans deux dgv différents. Or, il me semble que le nom des colonnes doit être unique.

    EDIT: J'ai fait un petit essai. Si l'on fait appel à un nom de colonne qui n'existe pas dans le DGV cible, il sort directement de la procédure sans aucune erreur.
    Dans votre cas, je présume que votre colonne "dgvcListeType" n'existe que dans le dgv "dgvPromoDetailDemo". Dans l'autre dgv, la colonne doit porter un autre nom.

    Sur un formulaire, j'ai placé un tabcontrol, deux tabpages avec un dgv dans chaque tabpage.

    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
     
    Public Class Form1
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.DataGridView1.BackgroundColor = Color.AliceBlue
            Me.DataGridView2.BackgroundColor = Color.Beige
            AddLines(Me.DataGridView1)
            AddLines(Me.DataGridView2)
            ChangeStyle(Me.DataGridView1)
            ChangeStyleDGV2(Me.DataGridView2)
        End Sub
     
        Public Sub AddLines(ByVal dgv As DataGridView)
            For i As Integer = 0 To 5
                Dim _row As New DataGridViewRow
                dgv.Rows.Add(_row)
            Next
        End Sub
     
        Public Sub ChangeStyle(ByVal dgv As DataGridView)
            For Each _row As DataGridViewRow In dgv.Rows
                If _row.Cells("Column1").Value Is Nothing Then
                    _row.DefaultCellStyle.BackColor = Color.Red
                End If
            Next
        End Sub
        Public Sub ChangeStyleDGV2(ByVal dgv As DataGridView)
            For Each _row As DataGridViewRow In dgv.Rows
                If _row.Cells("Column2").Value Is Nothing Then 'Si on remplace Column2 par Column1 (qui n'existe pas dans DataGridView2), on a exactement le comportement que vous décrivez
                    _row.DefaultCellStyle.BackColor = Color.Red
                End If
            Next
        End Sub
    End Class
    Certaines colonnes portent le même nom. Cela ne pose apparemment aucun problème.

    Citation Envoyé par mactwist69 Voir le message
    Quelques petites pistes :

    1) Tu dis avoir avancé au pas-à-pas, confirmes tu que le code se rends bien dans la boucle et "applique" le changement de couleur ? Pas d'exception?

    2) N'aurais tu pas d'autres événements lié au DGV qui pourraient interférer ?

    3) Juste au cas, où, j'ai déjà lu quelque part, avec les TabPage qu'il faille qu'il soit sélectionné pour prendre en compte les modifications visuels.
    Donc tu pourrais tester, dans chacun des événements des DataSourceChange une petite ligne pour mettre au premier plan le tabpage concerné.
    Si c'est ça, après tu pourras toujours masquer ce changement de Tabpage pour que se soit invisible.
    C'est exactement ce que tu expliques dans le point 3 que je constate. Si j'inverse les tabpages, c'est celui qui est à l'arrière plan au chargement qui "bug".
    Si je change la couleur des lignes lors du changement de sélection du tabpage (donc quand le 2e arrive au premier plan), alors ça fonctionne.

    Est-ce la "bonne" manière de faire ou est-ce un "work around" (en français?) ??
    Kropernic

  9. #9
    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
    "work around" = Bidouille ? lol

    D'un côté non car ce type de problème avec ce contrôle semble avéré, et cette solution aussi.

    D'un côté oui, parce que VB devrait pouvoir gérer ça sans avoir le focus. Peut être que le code qui mets à jour (ou prends en compte) le visuel ne se déclenche pas... Enfin je suppose.

    Si tu veux qu'on ne voit pas le changement de tab, Un petit SuspendLayout devrait faire l'affaire...

    Cette solution à l'avantage de charger tes 2 DGV d'un coup. Mais si tu voulais être clean, tu pourrais chargé le DGV au changement de Tab, mais ça ralentira le changement de Tab.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  10. #10
    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
    Citation Envoyé par mactwist69 Voir le message
    "work around" = Bidouille ? lol

    D'un côté non car ce type de problème avec ce contrôle semble avéré, et cette solution aussi.

    D'un côté oui, parce que VB devrait pouvoir gérer ça sans avoir le focus. Peut être que le code qui mets à jour (ou prends en compte) le visuel ne se déclenche pas... Enfin je suppose.

    Si tu veux qu'on ne voit pas le changement de tab, Un petit SuspendLayout devrait faire l'affaire...

    Cette solution à l'avantage de charger tes 2 DGV d'un coup. Mais si tu voulais être clean, tu pourrais chargé le DGV au changement de Tab, mais ça ralentira le changement de Tab.
    Non non, je remplis bien les dgv au changement de tab. C'est invisible (y a pas 20 lignes à afficher lol). C'est juste que j'aime bien faire les chargements dans le load et pas après comme ça c'est fait mais bon, je ferai avec si y a pas le choix.
    Kropernic

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Au lieu d'utiliser le DefaultCellStyle, on peut gérer l'event CellFormatting qui aura l'avantage de continuer à gérer la BackColor en cas de filtre ou de tri sur la dataGridView.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2007, 21h14
  2. Changement de couleur d'un libellé sur OnClick
    Par maysa dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 15h29
  3. CSS Pas de changement de couleur quan on clique sur un lien
    Par pmboutteau dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 16/08/2005, 10h15
  4. 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
  5. Changement de couleur quand j'affiche du texte...
    Par MaxPayne dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/12/2004, 13h55

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