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 :

Couleur de fond d'une ligne d'un DGV


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut Couleur de fond d'une ligne d'un DGV
    Bonjour, avec l'aide de chrismonoye et graffito j'ai pu affiché mon fichier texte dans un datagridview1, et à présent j'ai ajouter un code pour afficher une couleur différente d’après le texte présent dans la colonne, dégrée, mais voila le problème qui se pose, est que la couleur déborde sur la ligne suivante, voici un Screenshots du résultat, et mon code qui contient donc une erreur :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
            If DirectCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degré").Value, String) = "AUTO" Then
                DataGridView1.RowsDefaultCellStyle.BackColor = Color.Green
            ElseIf DirectCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degré").Value, String) = "MANU" Then
                DataGridView1.RowsDefaultCellStyle.BackColor = Color.Yellow
            ElseIf DirectCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degré").Value, String) = "EROR" Then
                DataGridView1.RowsDefaultCellStyle.BackColor = Color.Red
            End If
        End Sub

  2. #2
    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
    Le code est bon, mais il y a un problème d'ordre de remplissage des cellules : la colonne Degré n'est pas encore remplie au moment du CellFormatting de Date.

    Il faut trouver un moyen de réafficher la grille après l'avoir remplie. Peut-être un DataGridView.Refesh().

    Personellement, je ne remplis jamais les DataGridView directement :
    je créée une DataTable que je lie au DataGridView par un BindingSource. L'avantage est de pouvoir utiliser les propriété Filter et Sort du bindingSource pour le tri ou le filtrage sans toucher à la DataTable
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    ok je vais suivre ton conseil alors, il ma l'air judicieu, aurais tu un lien expliquant la facon de faire pour lier un datatable a mon datagridview ?
    d'avance merci pour ces precieux renseignements

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    pour votre code, J'utiliserais déjà un TryCast qui ne lève pas d'exception.(Click sur la nouvelle ligne du DGV si elle existe par exemple)
    Ensuite RowsDefaultCellStyle a un comportement étrange, avec ce que vous décrivez et chez moi un affichage sautillant ?
    Ces soucis se règlent avec Rows(e.RowIndex).DefaultCellStyle :
    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
        Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
     
            If TryCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degre").Value, String) = "AUTO" Then
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Green
            ElseIf TryCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degre").Value, String) = "MANU" Then
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Yellow
            ElseIf TryCast(Me.DataGridView1.Rows(e.RowIndex).Cells("Degre").Value, String) = "EROR" Then
                'DataGridView1.RowsDefaultCellStyle.BackColor = Color.Red
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            Else
                DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White
     
            End If
     
        End Sub
    Sinon le conseil de Graffito est à suivre.
    Le code est le même pour alimenter une DataTable, dans le genre :

    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
        Dim dtFromGrid As New DataTable()
        Dim bs As New BindingSource
     
        Private Sub TableForDgv()
            Dim ColDate As DataColumn = New DataColumn()
            ColDate.ColumnName = "Date"
            dtFromGrid.Columns.Add(ColDate)
            Dim ColHeure As DataColumn = New DataColumn()
            ColHeure.ColumnName = "Heure"
            dtFromGrid.Columns.Add(ColHeure)
            Dim ColDegre As DataColumn = New DataColumn()
            ColDegre.ColumnName = "Degre"
            dtFromGrid.Columns.Add(ColDegre)
            Dim ColEven As DataColumn = New DataColumn()
            ColEven.ColumnName = "Evenement"
            dtFromGrid.Columns.Add(ColEven)
     
            Dim lineseparation As String = Environment.NewLine
            Dim columnseparation() As String = {"=!="}
            Dim Elements As String() = Split(File.ReadAllText("C:\Users\laurent\Documents\static\log.txt"), lineseparation)
     
            For Each col As DataGridViewColumn In DataGridView1.Columns
                dtFromGrid.Columns.Add(col.Name)
            Next
     
            For i As Integer = 0 To Elements.Length - 1
                dtFromGrid.Rows.Add(Elements(i).Split(columnseparation, StringSplitOptions.None))
            Next
     
            bs.DataSource = dtFromGrid
     
            With DataGridView1
                .DataSource = bs
                .Columns("degre").HeaderText = "degré"
                .Columns("evenement").HeaderText = "évènement"
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells
            End With
     
        End Sub
    Et pour l'affichage, on se sert d'une vue personnalisée de la ligne dans la table :
    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
        Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
     
            'Récupération de la ligne correspondante dans la source de données.
            Dim row As DataRowView = CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRowView)
     
            If Not row Is Nothing Then
                If Not row("Degre") Is DBNull.Value Then
                    Dim degr As String = CStr(row("Degre"))
                    Dim cBackColor As Color = Color.White
                    Dim cForColor As Color = Color.Black
                    Dim font As New Font(DataGridView1.DefaultCellStyle.Font.FontFamily, 10)
     
                    Select Case degr
                        Case "AUTO"
                            cBackColor = Color.Green
                            cForColor = Color.White
                        Case "MANU"
                            cBackColor = Color.Yellow
                            cForColor = Color.DarkBlue
                        Case "EROR"
                            cBackColor = Color.Red
                            cForColor = Color.White
                    End Select
     
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = cBackColor
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.ForeColor = cForColor
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.Font = font
                End If
            End If
     
        End Sub
    Ici l'utilité de procéder ainsi n'est pas flagrant, car on peut faire plus court et plus simple en apparence.
    Il ne faut pas oublier que le DGV est un outil de présentation de données (ici dans notre cas) et cette façon de procéder sera nécessaire dès que l'on voudra afficher qu'une partie voulue de ces données.
    Exemple Button2 et 3 pour afficher que les "EROR" ou les "MANU" et là avec très peu de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            bs.Filter = "Degre = 'EROR'"
        End Sub
     
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            bs.Filter = "Degre = 'MANU'"
        End Sub

  5. #5
    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
    Exemple de création de DataTable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     Dim table As New DataTable
    ' Create four typed columns in the DataTable.
    table.Columns.Add("Dosage", GetType(Integer))
    table.Columns.Add("Drug", GetType(String))
    table.Columns.Add("Patient", GetType(String))
    table.Columns.Add("Date", GetType(DateTime))
    ' Add five rows with those columns filled in the DataTable.
    table.Rows.Add(25, "Indocin", "David", DateTime.Now)
    table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now)
    table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now)
    Ensuite, créer un New BindingSource et affecter la DataTable à sa propriété DataSource. Puis, affecter le BindingSource à la propriété DataSource du DataGridView.

    Edit : Grillé par chrismonoye
    Et EROR => ERROR
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

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

Discussions similaires

  1. [POO] Changer la couleur de fond d'une ligne de tableau
    Par guidav dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 30/04/2008, 15h27
  2. Changement couleur de fond d'une ligne avec FLEXGRID
    Par flophil78 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/01/2008, 19h22
  3. [html][debutant] couleur de fond sur une ligne
    Par yupa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 26/01/2006, 13h34
  4. Comment changer la couleur de fond d'une ligne du TRichEdit
    Par tibi666 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/09/2005, 17h31
  5. [JTable] Modifier la couleur de fond d'une ligne
    Par joes_bushi dans le forum Composants
    Réponses: 2
    Dernier message: 20/09/2005, 12h13

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