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 :

Apparence d'une cellule de DataGridView en fonction de son contenu


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    761
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 761
    Points : 274
    Points
    274
    Par défaut Apparence d'une cellule de DataGridView en fonction de son contenu
    Bonjour,

    je voudrais changer l'apparence d'une colonne en fonction de son contenu ou du contenu d'une cellule d'une autre colonne sur la même ligne.
    Par exemple, si une colonne contient des couleurs ("bleu", "rouge",...) je souhaite colorer le fond de la cellule de la ligne correspondante.

    Je pense à une boucle qui examine chaque ligne et la traite en fonction de la valeur de la dite colonne. Mais je trouve ça assez bourrin et cela pose le pb du rafraichissement à chaque fois que le contenu du tableau change (ça se gère par des Events...)

    Y a-t-il une solution plus simple ?

  2. #2
    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
    Bonsoir,

    Vous pouvez le faire sur l'évent CellValidated du DataGridView avec un truc du style :
    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
     
    Private Sub DataGridView1_CellValidated(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValidated
            Dim dgv As DataGridView = CType(sender, DataGridView)
            Dim CellStyle As New DataGridViewCellStyle
            If e.ColumnIndex = 1 Then
                Select Case dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
                    Case "Bleu"
                        CellStyle.BackColor = Color.Blue
                        'Si on veux par exemple colorer la cellule de la 3ème colonne :
                        dgv.Rows(e.RowIndex).Cells(2).Style = CellStyle
                    Case "Rouge"
                        CellStyle.BackColor = Color.Red
                        dgv.Rows(e.RowIndex).Cells(2).Style = CellStyle
                End Select
            End If
        End Sub
    L'avantage, c'est que l'on peut aussi définir le style des lignes entières, colonnes, cellules, modifier la police, la couleur de la police, ...
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    761
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 761
    Points : 274
    Points
    274
    Par défaut
    Merci c'est la méthode qu'il me fallait.
    J'ajouterai qu'on peut aussi utiliser l'event cellformating (exemple MSDN). Je n'ai pas encore trouvé si cela changeait quelque chose.

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    CellFormating n'est appelé qu'a l'affichage de la ligne. S'il y a 10 lignes affichées à l'écran sur les 500 que contient le DGV, l’événement n'est appelé que 10 fois. Il sera appelé à nouveau lorsque l'on descendra dans le DGV.
    Je ne pense pas que se soit le cas de CellValidated, à vérifier...

    (Ce n'est pas le rôle de CellValidated normalement)

  5. #5
    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,
    J'ai choisit l'évent CellValidated, bien que ce ne soit théoriquement pas son rôle, pour deux raisons :
    -L’événement est déclenché pour chaque cellule
    -Si l’événement CellValidating a été utilisé pour faire la validation de donnée, les valeurs sont justes.

    L'événement CellEndEdit peut aussi convenir (à vérifier s'il est déclenché lors du chargement des données à l'initialisation du formulaire)
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  6. #6
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    761
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 761
    Points : 274
    Points
    274
    Par défaut
    OK, en effet, l'événement CellFormatting est déclenché pour les cellules masquées lorsqu'on active le scroll, ce qui n'est pas du meilleur effet : on voit une fraction de seconde la cellule telle qu'elle est avant la modification de la couleur.

    Maintenant, je complique un peu ma question. Je voudrais mettre en fond de cellule une couleur avec des points.
    J'ai trouvé des exemples basés sur HatchBrush mais
    - ces exemples utilisent l'événement CellPainting qui a les mêmes inconvénients que CellFormatting sus-évoqués + d'autres effets désagréables lorsque je change la source de mon DTG
    - quand je l'utilise sur CellPainting, mon texte de cellule disparaît.

    Je voudrais donc, si c'est possible définir la texture de ma cellule dans l'événement CellValidated comme je l'ai fait pour définir le backcolor.
    Mais j'ai un peu de mal à maitriser les outils qui permettent sans doute de le faire : HatchBrush, InvokePaintBackground, DataGridViewCellPaintingEventArgs ...

    Quelle est la bonne méthode ?

  7. #7
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    761
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 761
    Points : 274
    Points
    274
    Par défaut
    Bon après quelques recherches, quelques observations,

    la méthode CellValidating ou CellValidated ne marche pas pour un DTG chargé par le code. Je ne vois pas d'autre solution que d'utiliser CellFormating même si l'affichage n'est pas des plus réussi lorsque je scrolle.

    Pour changer la texture de mon fond de cellule, je n'ai, à cette heure, pas trouvé de meilleure méthode que de passer par CellPainting. J'ai résolu les 2 inconvénients que je citais :
    - perte du texte : il faut le redessiner avec DrawString
    - effets de figeages et autres effets secondaires : il faut ajouter un e.handled = true après les instructions fillrectangle et drawstring (mais je n'ai pas compris pourquoi)

    Voilà le code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub monDTG_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles monDTG.CellPainting
     
            If e.RowIndex >= 0 AndAlso e.ColumnIndex = monDTG.Columns("Couleur").Index Then
                        e.Graphics.FillRectangle(New HatchBrush(HatchStyle.Percent10, Color.Black, Color.GreenYellow), e.CellBounds)
                        Dim strf As New StringFormat
                        strf.LineAlignment = StringAlignment.Center
                        e.Graphics.DrawString(CStr(e.Value), e.CellStyle.Font, Brushes.Black, e.CellBounds, strf)
                        e.Handled = True
             End If
        End Sub

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

Discussions similaires

  1. Evénement sur une cellule de DataGridView
    Par sepullayer dans le forum C++/CLI
    Réponses: 2
    Dernier message: 27/03/2009, 16h52
  2. Réponses: 13
    Dernier message: 05/03/2009, 00h05
  3. Mise en forme d'une cellule en fonction de son contenu
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/01/2008, 11h42
  4. Réponses: 8
    Dernier message: 20/08/2007, 17h37
  5. Affichage sur 2 lignes d'une cellule de DataGridView
    Par loic_86 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/06/2007, 21h32

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