none
Modifier la couleur d'une ligne d'un DataGridView RRS feed

  • Question

  • Bonjour,

    Je cherche à modifier la couleur de ma ligne de mon DataGridView pour une affichage de date et ensuite faire une alternance de couleur pour le listing des fichiers.

    Je me suis donc fait une condition qui ajoute une ligne pour la date avec cette option :
    mainDataGridView.RowsDefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);

    sinon elle liste le contenu du datatable avec ses options :
    mainDataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(255, 238, 238, 238);
    mainDataGridView.RowsDefaultCellStyle.BackColor = Color.White;

    Mon problème est que la couleur pour ma date ne s'affiche pas il me met directement l'alternance de couleur entre le blanc et le gris...

    J'ai essayé en ajoutant "this" de la facon suivante : this.mainDataGridView.RowsDefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);

    Mais çà ne change rien.

    Comment puis je faire çà ?

    Merci d'avance
    lundi 10 août 2009 13:03

Réponses

  • Si tu ajoutes directement tes lignes depuis ton Array vers la datagridview, tu peux modifier le style des cellules d'une lignes avec :

    this.dataGridView1.Rows[x].Cells[x].Style.BackColor = Color.Aquamarine;

    Si tu utilises une datasource tu peux utiliser l'event CellFormatting. C'est dans cet event qu'il faudra que tu gères les conditions pour tes couleurs. L'arguement de l'event de permet de savoir sur quelle ligne tu te trouves. Par exemple

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
      int i = e.RowIndex;
    
      if (i == 1)
      {
        this.dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Aquamarine;
      }
    }


    • Marqué comme réponse Francois_A mardi 11 août 2009 13:40
    mardi 11 août 2009 09:20
    Modérateur

Toutes les réponses

  • Bonjour,

    ton problème est que tu assignes 2 fois mainDataGridView.RowsDefaultCellStyle.BackColor à ta grille. Tu définis le style principal:
    mainDataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(255, 238, 238, 238);
    mainDataGridView.RowsDefaultCellStyle.BackColor = Color.White;
    Et ensuite tu définis précisement la couleur de la rangée de date.
    mainDataGridView..Rows[0].DefaultCellStyle.BackColor= Color.White;

     

     


    Microsoft MVP C# :: mongeon.devrpm.ca
    lundi 10 août 2009 14:31
    Modérateur
  • ok, je comprends. Je pensais que le This indiquait cette ligne. Donc si je mets
    this.mainDataGridView.RowsDefaultCellStyle.BackColor = Color.White;
    Le this correspond à mon DataGridView courant ?

    Sinon j'ai essayé en utilisant mainDataGridView.Rows[0].DefaultCellStyle.BackColor= Color.White; mais le compilateur me lève une erreur (enfin un avertissement).

    Il me dit : L'exception ArgumentOutOfRangeException n'a pas été gérée.

    A priori, il serait hors des limites de mon tableau. Bon je crois que mon code vos mieux que de long discourt de description.
                for (int i = 0; i < fi.Length; i++)
                {
                   if (i == 0)
                    { //Affiche la Date de crétion du/des fichiers (premiere ligne
                        //Crée une nouvelle ligne de données
                        DataRow row2 = table.NewRow();
    
                        // valeur de la ligne
                        row2["Courrier"] = fi[i].CreationTime.Date.ToString("D", new CultureInfo("fr-FR"));
    
    
                        // ajout de la ligne
                        table.Rows.Add(row2);
    
                        // Couleur
                        mainDataGridView.Rows[0].DefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);
                        
                    }
                    else
                    { //Affiche la Date de crétion du/des fichiers 
    
                        if (fi[i].CreationTime.Day != fi[(i - 1)].CreationTime.Day)
                        {
                            //Crée une nouvelle ligne de données
                            DataRow row2 = table.NewRow();
    
                            // valeur de la ligne
                            row2["Courrier"] = fi[i].CreationTime.Date.ToString("D", new CultureInfo("fr-FR"));
    
    
                            // ajout de la ligne
                            table.Rows.Add(row2);
    
                            // Couleur
                            mainDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);
                        }
    
                    }
    
                   //Crée une nouvelle ligne de données
                   DataRow row = table.NewRow();
    
                   // valeur de la ligne
                   row["Courrier"] = fi[i].Name;
    
                   // ajout de la ligne
                   table.Rows.Add(row);
    

    Comme tu peux le voir, normalement Rows[0] ne peut pas être hors limite puisque je teste avant que i=0 ! Donc je ne comprends pas. Est ce que le compilateur veut que je mette en place une gestion d'exception via Try catch... ?

    Merci d'avance


    lundi 10 août 2009 15:19
  • Salut,

    this représente la classe courante, et non pas le dataGridView. L'erreur que tu sembles avoir est que la rangée 0 (.Rows[0]) n'existe pas dans le mainDataGridView, donc lève un erreur. Pour ce genre de problème, je fais personnellement une double validation, soit que mainDataGridView.Rows.Count > 0 et j'insère aussi un Try..Catch qui logue tout mes problèmes dans un fichier, mais qui ne fait pas planter mon application. 

    Que représente la variable table dans ton code? Car en inspectant ton code, jamais tu n'ajoutes de rangée à mainDataGridView.


    Microsoft MVP C# :: mongeon.devrpm.ca
    lundi 10 août 2009 15:39
    Modérateur
  • Désolé j'aurais du mettre toute ma classe plutot que mon bout de code.

    private DataTable LoadTable()
            {   
    
                //chemin lecteur réseau
                string chemin = @"J:\Secrétariat\Courrier";
    
                // Creer une référence
                DirectoryInfo di = new DirectoryInfo(chemin);
    
                // Creer un tableau contenant d'un dossier 
                FileInfo[] fi = di.GetFiles();
                
    
                //Trie par date
                Array.Sort<FileInfo>(fi, delegate(FileInfo x, FileInfo y)
                {
                    return x.CreationTime.Date.CompareTo(y.CreationTime.Date);
                });
                
                // Inverse l'ordre de trie
                Array.Reverse(fi);
    
                // init datatable
                DataTable table = new DataTable();
                
                table.Columns.Add("Courrier", typeof(string));
    
                for (int i = 0; i < fi.Length; i++)
                {
                   if (i == 0)
                    { //Affiche la Date de crétion du/des fichiers (premiere ligne
                        //Crée une nouvelle ligne de données
                        DataRow row2 = table.NewRow();
    
                        // valeur de la ligne
                        row2["Courrier"] = fi[i].CreationTime.Date.ToString("D", new CultureInfo("fr-FR"));
    
    
                        // ajout de la ligne
                        table.Rows.Add(row2);
    
                        // Couleur
                        mainDataGridView.Rows[0].DefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);
                        
                    }
                    else
                    { //Affiche la Date de crétion du/des fichiers 
    
                        if (fi[i].CreationTime.Day != fi[(i - 1)].CreationTime.Day)
                        {
                            //Crée une nouvelle ligne de données
                            DataRow row2 = table.NewRow();
    
                            // valeur de la ligne
                            row2["Courrier"] = fi[i].CreationTime.Date.ToString("D", new CultureInfo("fr-FR"));
    
    
                            // ajout de la ligne
                            table.Rows.Add(row2);
    
                            // Couleur
                            mainDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 251, 207, 46);
                        }
    
                    }
    
                   //Crée une nouvelle ligne de données
                   DataRow row = table.NewRow();
    
                   // valeur de la ligne
                   row["Courrier"] = fi[i].Name;
    
                   // ajout de la ligne
                   table.Rows.Add(row);
    
        
    
    
                    } 
    Merci pour la précision concernant this
    lundi 10 août 2009 15:48
  • Une petite question, à quel moment ajoutes-tu la nouvelle ligne a mainDataGridView, il me semble que tu n'ajoutes seulement à la DataTable table?
    Microsoft MVP C# :: mongeon.devrpm.ca
    lundi 10 août 2009 18:18
    Modérateur
  • J'ajoute ma table à mon mainDataGridView dans ma class form1
            public Form1()
            {
                InitializeComponent();
    
    ...
    
                // charge le gridview
                mainDataGridView.DataSource = this.LoadTable();
    
                dataGridView1.DataSource = this.GestionMois();
                
    
                // Couleur du datagrid
                mainDataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(255, 238, 238, 238);
                mainDataGridView.RowsDefaultCellStyle.BackColor = Color.White;
    
    ...
    }

    lundi 10 août 2009 18:32
  • Si tu ajoutes directement tes lignes depuis ton Array vers la datagridview, tu peux modifier le style des cellules d'une lignes avec :

    this.dataGridView1.Rows[x].Cells[x].Style.BackColor = Color.Aquamarine;

    Si tu utilises une datasource tu peux utiliser l'event CellFormatting. C'est dans cet event qu'il faudra que tu gères les conditions pour tes couleurs. L'arguement de l'event de permet de savoir sur quelle ligne tu te trouves. Par exemple

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
      int i = e.RowIndex;
    
      if (i == 1)
      {
        this.dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Aquamarine;
      }
    }


    • Marqué comme réponse Francois_A mardi 11 août 2009 13:40
    mardi 11 août 2009 09:20
    Modérateur
  • bon, dans mon cas çà serait la deuxième solution qu'il faudrait que j'emploie. Le problème c'est que je ne vois pas  où et comment intégré la classe que tu m'as mis comme exemple dans mon code !

    Sinon j'aimerai aussi que tu m'éclaircisses quelques points afin de comprendre et donc apprendre ;) :

    * Pourquoi ai-je obtenu mon erreur "out of range" avec mon code ci dessus ?
        Est ce parce que j'assigne directement à la datatable et non au DataGridView ?

    * Concernant les arguments de ta classe :
    à quoi sert "object sender" ? Je n'ai pas trouvé de référence dans msdn.

    Sinon je suppose que DataGridViewCellFormattingEventArgs correspond à mon DataGridView ?

    Merci d'avance
    mardi 11 août 2009 12:52
  • CellFormatting est un event sur ta datagridview ( cf : http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting.aspx )
    Dons tu peux l'ajouter via le designer sur ta datagridview ( dans propriétés > évènement ). Un double click sur CellFormatting est l'event est ajouté.

    object sender c'est l'objet qui a déclenché l'évènement donc dans ton cas se sera ta grid ( et donc dans ton cas ce n'est pas super utile, puisque tu as déjà accès à ta grille ... mais cela peut l'être dans d'autres situations )

    DataGridViewCellFormattingEventArgs c'est l'argument renvoyé par l'event. En fonction des évènement, les arguments peuvent être différents ( mais héritent toujours de EventArgs ) pour porter des informations suplémentaires.

    Ton out of range, survient car tu cherches à accèder à la ligne de ta datagridview alors que celle ci n'en contient aucune ( tu n'as pas encore fait l'affectation de la datasource )

    mardi 11 août 2009 13:08
    Modérateur
  • ok, je comprends mieux.

    Je te remercie pour tes explications, tes réponses et ta patience. Ca me parait beaucoup plus clair maintenant !

    Merci
    mardi 11 août 2009 13:40