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 :

Changer la couleur d'une ligne d'un Datagrid suivant un critère


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut Changer la couleur d'une ligne d'un Datagrid suivant un critère
    Bonjour

    Depuis quelques jours j'essaye de trouver une solution à mon problème par les exemples sur le Net ou par les cours. Je crois que mon problème est simple mais il y une truc qui m'échappe. J'ai une DataGrid charger, et je veux colorer des lignes selon une condition précise (j'ai une colonne nommée "DateRetraite" et je veux que tous les employer qui ont une date inférieure à la date système se marquent en Rouge (toute la ligne) et que les employer qui ont encore 6 mois avant la date système se marquent en Orangé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      Cn.Open()
            CmdRet.CommandType = CommandType.Text
            CmdRet.CommandText = "Select TPersonnels.CNRPS, TPersonnels.PrenomPers, TPersonnels.NomPers, TPersonnels.DateNaisPers order by TPersonnels.DateRetraite ASC"
            CmdRet.Connection = Cn
            DrRet = CmdRet.ExecuteReader
            DtRet.Load(DrRet)
            DataRet.DataSource = DtRet 'Afficher la resultat de la requette dans DataGridView1
            Cn.Close()
            DataRet.Columns(0).HeaderText = "CNRPS"
            DataRet.Columns(1).HeaderText = "Nom"
            DataRet.Columns(2).HeaderText = "Prénom"
            DataRet.Columns(3).HeaderText = "DateNaissance"
            DataRet.Columns(4).HeaderText = "DateRetraite"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub DataRet_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataRet.CellFormatting
         If Me.DataRet.Rows(e.RowIndex).Cells.Item("DateRetraite").ToString= "01/01/2013" Then
                Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            End If
        End Sub
    Le Message d’erreur : La colonne nommée DateRetraite est introuvable.

    J'ai pris une date fixe pour tester mais sans aucune résultat.("01/01/2013")
    Je compte sur vous les brillant pour m'aider et merci.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    le Name et le HeaderText d'une colonne peuvent être nommés différemment.
    Ici la propriété Item attend un columnName.
    A voir...

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Bonjour chrismonoye
    J'ai nommé le champs et le HeaderText par le même nom pour éviter les erreurs de frappe. Lors de l'exécution de la requête sans chercher à changer de couleur tous marche bien et la colonne DateRetraite s'affiche bien avec les données enregistrés. tous marche bien. Mais lorsque je veux colorer des lignes suivant le critère voulue le message d'erreur apparu malgré que la colonne existe. J'ai essayé les codes suivants le même message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub DataRet_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataRet.CellFormatting
         If Me.DataRet.Rows(e.RowIndex).Cells.Item("DateRetraite").ToString= "01/01/2013" Then
                Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            End If
        End Sub
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub DataRet_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataRet.CellFormatting
         If Me.DataRet.Rows(e.RowIndex).Cells.("DateRetraite").ToString= "01/01/2013" Then
                Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            End If
        End Sub
    et avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub DataRet_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataRet.CellFormatting
         If Me.DataRet.Rows(e.RowIndex).Cells.Item(4).ToString= "01/01/2013" Then
                Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
            End If
        End Sub
    le message d'erreur est : L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonsoir,
    à tester en adaptant nom de colonne et valeur recherchée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim row As DataRowView = CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRowView)
            If Not row Is Nothing Then
                If row("Fonction").ToString = "Propriétaire" Then
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta proposition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim row As DataRowView = CType(DataRet.Rows(e.RowIndex).DataBoundItem, DataRowView)
            If Not row Is Nothing Then
                If row("DateRetraite").ToString = "01/01/2012" Then
                    Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If
    il colore tous en rouge sans prendre compte du condition c-à-dire tous les 2011 et les 2012 or je jeux seulement les enregistrements dont la date est 01/01/2012

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    je ne sais pas ne pouvant reproduire ce comportement.
    Peut être une conversion aléatoire de types : String <------> Date si la colonne est de type Date?
    Dans ce sens je ne rencontre pas de soucis avec un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim filtre As String = "24/03/2006"
            Dim dt As DateTime = Convert.ToDateTime(filtre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            'Récupération de la ligne de données
            Dim row As DataRowView = CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRowView)
            If Not row Is Nothing Then
                If Convert.ToDateTime(row("Date de soumission")) = dt Then
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If
    Ou avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim cell As DataGridViewCell = Me.DataGridView1.Rows(e.RowIndex).Cells("Date de soumission")
            If Not cell.Value Is Nothing Then
                If Convert.ToDateTime(cell.Value) = dt Then
                    Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Bonjour

    Dans ma table TPersonnels le champs "DateRetraite" est de type Texte.

    J'ai ajouté à mon DataGrid une colonne "Grade" pour plus de filtre c-à-dire je veux seulement les employer dont la grade de technicien supérieur qui vient de sortir en retraite. le code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Dim row As DataRowView = CType(DataRet.Rows(e.RowIndex).DataBoundItem, DataRowView)
            If Not row Is Nothing Then
                'If row("DateRetraite").ToString = "01/01/2012" Then
                If row("DateRetraite").ToString < CType(FormatDateTime$(Now, DateFormat.ShortDate), Date) Then
                    Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If
            End If
    ce code fonctionne bien avec quelques grade (comme Directeurs, Sous Directeurs) dont le nombres d'enregistrement est petit (entre 5 et 16 enregistrements) mais lorsque je sélectionne un grade (Techniciens, Agents de terrain...) dont le nombres d'enregistrement est important, toute la grille se colore en rouge et le critère de recherche DateRetraite ne sera pas respecter.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut
    bizarre
    la partie select de la requete contient 4 item
    Select TPersonnels.CNRPS, TPersonnels.PrenomPers, TPersonnels.NomPers, TPersonnels.DateNaisPers

    et le DGW a 5 colonnes

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CmdRet.CommandText = "Select TPersonnels.CNRPS, TPersonnels.PrenomPers, TPersonnels.NomPers, TPersonnels.DateNaisPers, TPersonnels.DateRetraite order by TPersonnels.DateRetraite ASC"
    TPersonnels.DateRetraite existe peut être une faute lors du copie du code

    J'ai changé Order by
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...order by TPersonnels.DateRetraite ASC ' Ascendant
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...order by TPersonnels.DateRetraite DESC ' Descendant
    et ça fonctionne pour le moment et cela avec la proposition de chrismonoye


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Private Sub DataRet_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataRet.CellFormatting
     
            Dim row As DataRowView = CType(DataRet.Rows(e.RowIndex).DataBoundItem, DataRowView)
            If Not row Is Nothing Then
                If row("DateRetraite").ToString < CType(FormatDateTime$(Now, DateFormat.ShortDate), Date) Then
                    Me.DataRet.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red
                End If
            End If
     
        End Sub
    Je vais le tester pour tous mes conditions et si ça marche bien je taperais Résolut

    Merci pour tous.

  10. #10
    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
    A vérifier mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.DataRet.Rows(e.RowIndex).DefaultCellStyle
    contient un style par défaut que toutes les lignes contiennent. Le changer revient a changer le style par défaut de toutes les lignes...

    il faudrait créer un nouveau style erreur et le mettre au ligne en erreur.

Discussions similaires

  1. Changer la couleur d'une ligne d'un datagrid
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/05/2007, 19h15
  2. Changer la couleur d une ligne de tableau au survol
    Par logica dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/07/2005, 11h57
  3. Réponses: 7
    Dernier message: 28/06/2005, 11h53
  4. Réponses: 8
    Dernier message: 14/05/2004, 11h18
  5. [VB6]Changer la couleur d'une ligne d'un ListView
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/03/2003, 17h02

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