160 votes

Comment changer la couleur d'une ligne dans un datagridview ?

Je voudrais changer la couleur d'une ligne particulière dans mon datagridview. La ligne doit passer au rouge lorsque la valeur de la cellule 7 est inférieure à celle de la cellule 10. Avez-vous des suggestions sur la manière d'y parvenir ?

224voto

Ricardo Points 2388

Vous devez parcourir en boucle les lignes de la grille de données, puis comparer les valeurs des colonnes 7 et 10 sur chaque ligne.

Essayez ça :

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }

1 votes

Merci pour votre aide Ricardo. J'ai essayé le code que vous avez suggéré. Je n'arrive toujours pas à le faire fonctionner. Pourriez-vous jeter un coup d'œil à ce code et me dire où je me suis trompé ? Je suis un étudiant débutant en C#. Je suis sûr que je n'ai simplement pas écrit le code de comparaison correctement. foreach (DataGridView row in vendorsDataGridView.Rows) { if (row.Cells[7].Value is < row.Cells[10].Value) { dataGridViewTextBoxColumn7.DefaultCellStyle.BackColor = red ; } } Je vous remercie de votre aide. EB

0 votes

EB J'ai ajouté un nouveau code basé sur le code que vous avez fourni. Votre sintax était un peu décalé, essayez le code que je viens d'ajouter ci-dessus.

2 votes

Ricardo. J'ai changé .text en .value et changé DefaultCellstyle.Backcolor = color.red et le code a fonctionné !!! Merci pour votre temps ! EB

71voto

Eden Points 593

J'étais en train d'étudier ce problème (je sais donc que cette question a été publiée il y a presque 3 ans, mais peut-être que cela aidera quelqu'un... ) mais il semble qu'une meilleure option soit de placer le code à l'intérieur de la balise RowPrePaint afin de ne pas avoir à parcourir chaque ligne, mais seulement celles qui sont peintes (ce qui permet d'obtenir de bien meilleures performances sur de grandes quantités de données) :

Attacher à l'événement

this.dataGridView1.RowPrePaint 
    += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
        this.dataGridView1_RowPrePaint);

Le code de l'événement

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text)) 
    {
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
    }
}

3 votes

J'aime beaucoup la façon dont vous saisissez le problème à la racine au lieu d'attendre que tout soit peint. C'est une approche très "originale". La plupart des gens préfèrent repasser par toutes les lignes...

0 votes

En plus d'être beaucoup plus rapide, cela permet aussi de le faire au bon moment. J'avais des problèmes avec mes lignes qui n'étaient pas colorées, probablement parce que j'avais réglé la couleur au mauvais moment. Avec cette approche, c'est garanti que ça se passe au bon moment.

1 votes

Cela fonctionne très bien. De plus, après le triage, il se rafraîchit de manière correcte.

26voto

SLaks Points 391154

Vous cherchez le CellFormatting événement.
Ici est un exemple.

2 votes

La différence avec cette approche est que chaque cellule sera comparée, et non une seule. Cela peut poser un problème de performance si vous avez plusieurs centaines de cellules.

21voto

user1614017 Points 81

J'ai également eu du mal à modifier la couleur du texte - je n'ai jamais vu la couleur changer.

Jusqu'à ce que j'ajoute le code pour changer la couleur du texte à l'événement DataBindingsComplete pour DataGridView . Après cela, ça a marché.

J'espère que cela aidera les personnes confrontées au même problème.

0 votes

La couleur du texte ne change pas dans la surcharge onLoad(..) ou dans l'événement. DataBindingsComplete est un bien meilleur endroit pour faire le réglage de la couleur des lignes.

13voto

Demi Points 3547

Quelque chose comme ce qui suit... en supposant que les valeurs dans les cellules sont des nombres entiers.

foreach (DataGridViewRow dgvr in myDGV.Rows)
{
  if (dgvr.Cells[7].Value < dgvr.Cells[10].Value)
  {
    dgvr.DefaultCellStyle.ForeColor = Color.Red;
  }
}

non testé, donc toutes mes excuses pour toute erreur.

Si vous connaissez la ligne particulière, vous pouvez sauter l'itération :

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
  dgvr.DefaultCellStyle.ForeColor = Color.Red;
}

0 votes

Je vous remercie pour votre aide. Votre suggestion est la plus proche de la résolution du problème que j'ai trouvée. Mais je continue à obtenir l'erreur disant que soit "Value" n'existe pas dans le contexte, soit "Cells" n'existe pas dans le contexte. J'essaie de trouver une solution...

0 votes

Cette ligne de code (dgvr.Cells[7].Value < dgvr.Cells[10].Value) me donne maintenant cette erreur L'opérateur '<' ne peut pas être appliqué aux opérandes de type 'objet' et 'objet'.

0 votes

Transformez-les en Integer, puis :-) quelque chose comme : Convert.ToInt32(dvgr.Cells[7].Value) < Convert.ToInt32(dgvr.Cells[10].Value)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X