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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    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, ...

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    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 : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    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 émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 337
    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)

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    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 ?

+ 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, 15h52
  2. Réponses: 13
    Dernier message: 04/03/2009, 23h05
  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, 10h42
  4. Réponses: 8
    Dernier message: 20/08/2007, 16h37
  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, 20h32

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