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 :

Modification de DataGridView en fonction des valeurs de cellule


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Modification de DataGridView en fonction des valeurs de cellule
    Bonjour,

    Je voudrais modifier l'apparence de certaines cellules en fonction des valeurs récupérées de ma base.
    test1-Colorer une cellule.
    test2-Remplacer une texte par une image.

    J'ai trouvé beaucoup d'exemples et d'explications sur le net.
    Là, je me base sur un exemple fourni par MS. Je comprends bien le code et celui-ci semble s'appliquer correctement... jusqu'à un certain point. Et je bloque.

    Le 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
        ' Modifier l'affichage des cellules en fonction de leur valeur
        Private Sub dataGridView1_CellFormatting(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _
            Handles DataGridView1.CellFormatting
     
            '*********************************************
            ' colore la cellule en fonction de sa valeur.
            '*********************************************
            If DataGridView1.Columns(e.ColumnIndex).Name.Equals("page") Then
     
                'Si le numéro de page < 100 --> On colore la cellule en rouge
                If CInt(e.Value) < 100 Then
                    e.CellStyle.BackColor = Color.Red
                    e.CellStyle.SelectionBackColor = Color.DarkRed
                End If
            End If
     
            '**************************************************
            ' Remplace les valeurs d'une chaine par une image.
            '**************************************************
            Dim MonIMAGE = New Bitmap("impr.jpg")
     
            If DataGridView1.Columns(e.ColumnIndex).Name.Equals("impr") Then
     
                ' On vérifie que la valeur est une chaine
                Dim stringValue As String = TryCast(e.Value, String)
                If stringValue Is Nothing Then Return
     
                ' On place la valeur du texte en ToolTip
                Dim cell As DataGridViewCell = _
                    DataGridView1(e.ColumnIndex, e.RowIndex)
                cell.ToolTipText = stringValue
     
                ' Remplace la chaine par l'image
                Select Case stringValue
     
                    Case "ok"
                        e.Value = MonIMAGE '--> Affiche "System.Drawind.Bitmap" au lieu de l'image
                End Select
     
            End If
     
        End Sub
    Pour le test 1, à savoir, colorer la cellule en fonction de sa valeur... Pas de problème.
    Par contre, le test 2, l'affichage de l'image ("impr.jpg") en fonction de la valeur de la cellule ("ok") bloque.

    Il remplace bien les cellules, mais au lieu de mettre l'image, il m'affiche "System.Drawind.Bitmap"
    Si je passe par un icône (MonICONE = New icon("impr.ico")), il m'affiche à la place du "ok", "(icône)"

    J'ai placé mes fichiers jpg et ico dans le répertoire de l'application

    Qu'ai je oublié, qu'est ce qui bloque ?

  2. #2
    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 : 42
    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
    Bonjour,

    il vous faut rajouter une colonne de type image : DataGridViewImageColumn
    et masquer la colonne contenant le texte.
    Il est normal qu'en essayant de placer une image dans une colonne faite pour contenir du texte il affiche la méthode toString de l'objet stocké qui est ça seul représentation textuelle.

    Voici un petit lien MSDN sur tous les types de colonne du dataGridView

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse...

    En fait, c'est un peu ce que j'essayais de faire.
    Ce que tu m'as dit m'a paru clair et m'a conforté dans le fait que j'étais (plutôt) sur la bonne voie...
    Pourtant j'ai passé l'après-midi et la soirée à essayer de me dépatouiller (j'aime bien chercher et trouver)...

    Mais là, j'y comprend plus rien, j'ai la tête en vrac...

    Pour résumer, si je crée le DataGridView et ses colonnes, j'arrive à utiliser des images en fonction des valeurs d'une autre colonne... Ca ça fonctionne.
    Par contre, quand je dessine un DGView et que je le remplie avec les valeur de ma base access, je n'arrive pas à faire correspondre ma colonne texte avec cette fichue colonne image...

    Je suis sûr que la solution est là, que je ferai mieux de laisser tomber et de reprendre ça à tête reposée...

    Je continue à chercher... Mais si quelqu'un peut me donner une piste, un exemple simple ou un flingue, c'est pas de refus...

  4. #4
    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
    Tu peux afficher l'image en gérant l'event CellPainting du DataGridView :

    Code en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Image imgA = Image.FromFile(@"C:\imageA.gif");
    Image imgB = Image.FromFile(@"C:\imageB.gif");
     
    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
            {
                if (dataGridView1.Columns[e.ColumnIndex].Name=="Ma_colonne_avec_images")
               {
                   if ((string)e.Value=="A") { e.Graphics.DrawImage(imgA, e.CellBounds); e.Handled = true; }
                   if ((string)e.Value=="B") { e.Graphics.DrawImage(imgB, e.CellBounds); e.Handled = true; }
                }
            }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Merci pour le code... Je comprends et arrive à transposer en VB.

    Mais mon principal problème vient plutôt du fait que je n'arrive pas à créer ma colonne image lorsque les données viennent d'une base.
    Mon DataGridView n'affiche que les colonnes "existantes".

    Je déclare chaque colonne texte (0 à 6) en vue de formatage et une colonne image (7) en plus :

    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
            'Mise en forme de la colonne note
            Dim idColumn6 As New DataGridViewTextBoxColumn()
            idColumn6 = DataGridView1.Columns("note")
            With idColumn6
                .HeaderText = "note"
                .ToolTipText = "les notes"
                '.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
                .Resizable = DataGridViewTriState.False
                .Width = 50
                .ReadOnly = True
                .Visible = False
            End With
     
            '*********************************************
            Dim idColumn7 As New DataGridViewImageColumn()
            With idColumn7
                .Name = "impr000"
                .ImageLayout = DataGridViewImageCellLayout.Zoom
            End With

    Les colonnes texte sont bien formatées, celles que je veux, apparaissent bien, mais la colonne "7" (image) ne veux pas apparaître (j'ai essayé aussi un AddRange...)...
    J''ai l'impression, à force de chercher, que je mélange plusieurs trucs...

    Pouvez-vous m'aiguiller... Je comprend plus rien...

  6. #6
    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 : 42
    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
    DataGridView.AutoGenerateColumns :
    Obtient ou définit une valeur indiquant si les colonnes sont créées automatiquement lorsque les propriétés DataSource ou DataMember sont définies.

  7. #7
    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
    Mais mon principal problème vient plutôt du fait que je n'arrive pas à créer ma colonne image lorsque les données viennent d'une base.
    L'utilisation de CellPainting supposait simplement de customiser l'apparence d'une colonne standard (integer, string, ...) issue de la DataBase sans crééer une colonne image spéciale.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    @Sankasssss : Ne m'embrouille pas, ne m'embrouille pas... s'il te plait !!
    Nan, j'rigole... En fait, je ne comprends pas à quoi peut me servir cet "AutoGenerateColumns" (il ne me reste plus beaucoup de neurones...).
    En effet, mes colonnes (issues de la base) me semble déjà "autogénérées", non?

    Bon... Entre temps, j'ai réussi... Mais j'ai pô compris comment. Si quelqu'un peut m'expliquer, ce serait cool.

    Je suis reparti de zéro, sur un test, en suivant les conseils.
    -J'ai récupéré ma table dans le DGV
    -J'ai créé une colonne "image" (que je voulais cacher par la suite)
    -Et j'ai construis ma fonction (à tâtons) comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
     
            Dim MonIMAGE2 As Bitmap = New Bitmap("impr.jpg")
            Dim stringValue As String = TryCast(e.Value, String)
     
            If DataGridView1.Columns(5).Name = "impr" Then
                If stringValue = "ok" Then
                    e.Graphics.DrawImage(MonIMAGE2, e.CellBounds.X + 10, e.CellBounds.Y, 12, 15)
                    e.Handled = True
                End If
            End If
        End Sub
    Je pensais qu'il fallait utiliser une colonne image, et remplir celle-ci en fonction de la colonne de référence... mais je me rends compte en écrivant ce message que ce que j'ai fait tout autre chose.

    En effet, je peux me passer de la colonne image.
    J'ai l'impression (dites moi si je me trompe), que, tel que j'ai traité le problème, les images viennent juste, se positionner au dessus des cellules de ma colonne texte...

    C'est gênant ce que j'ai fait?

    En tous cas, pour le moment ce n'est pas très beau car un arrière plan blanc se crée derrière mes images et recouvre la totalité de ma cellule.

    -Est-ce que je vais réussir à retirer ce fond ? Et comment?
    -Ou faut-il que je recommence pour réussir à placer les images dans les cellules plutôt qu'au dessus.

    A noter : Quand je déplace "l’ascenseur" du DGV, le fond blanc disparaît.

  9. #9
    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
    J'ai l'impression que, tel que j'ai traité le problème, les images viennent juste, se positionner au dessus des cellules de ma colonne texte
    En fait, le Cellpainting est appelé lorsque la cellule doit se tracer, et si e.handled = true, l'appel au tracé standard ne se fait pas.

    Pour le fond, avant le drawimage , il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)   // ou une autre couleur
    e.Graphics.FillRectangle(backColorBrush, e.CellBounds)

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    @ Graffito : Je n'avais pas vu ton message hier (on a posté en même temps).
    Il est clair... J'ai compris (enfin!!)... Merci.

    Je me suis donc bien embrouillé entre 2 méthodes...
    Bon, là ça marche, je vais rester sur le "Cellpainting" que je comprend... Ça me convient.

    Pour ce qui est de la couleur de fond, ça marche (encore merci)... Presque...

    En effet, les couleurs de lignes de mon DGV sont alternées (une ligne sur 2).
    Je ne peux donc pas choisir de couleur fixe.
    Je ne peux pas utiliser non plus BackColor ou ForeColor...

    Y'a t'il un moyen de récupérer la couleur de la cellule pour l'appliquer au fond de l'image?

    Sinon, je me rabattrai sur un test sur les lignes paires ou impaires, ça doit être possible comme ça...

  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
    Y'a t'il un moyen de récupérer la couleur de la cellule pour l'appliquer au fond de l'image?
    e.CellStyle.BackColor

  12. #12
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    @Graffito
    Oui, j'ai testé, cela me semblait logique, mais ça ne marchait pas...

    Et en fait... C'est de ma faute, j'ai laissé traîner un "e.CellStyle.BackColor = Color.Gray"

    Au temps pour moi... J'ai honte...

    Merci pour tout.

    Juste une ch'tite dernière question : Lorsque ma ligne a le focus, elle se colore différemment... Sauf les images (normal, puisque le fond est figé par le e.CellStyle.BackColor).

    Y'a t'il moyen de remédier à cela?

  13. #13
    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
    On doit pouvoir "recolorer" la ligne avec le focus en gérant l'event CellFormattting dans lequel on testera si e.RowIndex=MyDataGridView.CurrentRow.Index et, dans ce cas, on modifiera e.CellStyle.BackColor et e.CellStyle.ForeColor.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Comme le focus était sur mon champs de recherche, j'avais un message d'erreur. J'ai donc forcé le focus sur le DGV (focus + select).

    Mais évidemment, l'erreur revenait s'il n'y avait plus de résultat (après recherche) dans le DGV.
    J'ai donc fait un test sur le nombre de résultat (de lignes, plutôt)... Je précise ça car j'ai un peu galéré, pensant que je devais me baser sur un nombre de ligne nul... Alors qu'il reste toujours au moins 1 ligne vierge...

    Voici donc ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If DataGridView1.Rows.Count <> 1 Then                               ' S'il y a + d'1 lignes ds le DGV
         If e.RowIndex = DataGridView1.CurrentRow.Index Then             ' Si la ligne est selectionnée
              e.Graphics.FillRectangle(FocusColorBrush, e.CellBounds)     ' --> Couleur Focus
         Else                                                            ' Sinon
              e.Graphics.FillRectangle(backColorBrush, e.CellBounds)      ' --> Couleur Cellule
         End If
    End If
    Super, je suis content d'être venu à bout de ce problème qui me paraissait tellement simple au départ et qui m'a posé tellement de problèmes.

    Merci à tous les 2 de m'avoir aidé,
    en particulier à toi, Graffito pour ta patience et pour ton aide précieuse.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/02/2008, 15h32
  2. Réponses: 2
    Dernier message: 13/12/2007, 16h02
  3. cocher une case en fonction des valeurs sur plusieurs plages
    Par flyfranky dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 15/11/2007, 11h20
  4. Réponses: 4
    Dernier message: 06/03/2007, 14h35
  5. mettre à jour un dataset en fonction des valeurs qu'il contient ?
    Par isachat666 dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/06/2006, 14h03

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