Comment changer la couleur de ligne dans datagridview?

Je voudrais changer la couleur d'une ligne particulière dans mon datagridview. La ligne doit être changée en rouge lorsque la valeur de columncell 7 est inférieure à la valeur de columncell 10. Des suggestions sur la façon d'accomplir cela?

115
demandé sur abatishchev 2010-02-03 06:00:12

17 réponses

Vous devez parcourir les lignes de datagridview, puis comparer les valeurs des colonnes 7 et 10 sur chaque ligne.

Essayez ceci:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }
161
répondu Ricardo Sanchez 2013-03-18 21:29:04

J'enquêtais juste sur ce problème (donc je sais 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 est de placer le code dans l'événement RowPrePaint afin que vous n'ayez pas à parcourir chaque ligne, seulement celles qui sont peintes (donc il fonctionnera beaucoup mieux sur une grande quantité de données:

Joindre à 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;
    }
}
45
répondu Eden 2017-01-30 11:49:00

Vous cherchez le CellFormatting événement.
Voici un exemple.

22
répondu SLaks 2010-02-03 03:02:43

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

Jusqu'à ce que j'ai ajouté le code pour changer la couleur du texte à l'événement DataBindingsComplete pour DataGridView. Après cela, il a travaillé.

J'espère que cela aidera les gens qui font face au même problème.

19
répondu user1614017 2012-11-26 08:10:54

Quelque chose comme ce qui suit... en supposant que les valeurs dans les cellules sont des 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 ignorer l'itération:

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
  dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
13
répondu Demi 2010-02-03 04:04:12

Certaines personnes aiment utiliser le Paint, CellPainting ou CellFormatting événements, mais notez que la modification d'un style dans ces événements provoque des appels récursifs. Si vous utilisez DataBindingComplete, il ne s'exécutera qu'une seule fois. L'argument de CellFormatting est qu'il est appelé uniquement sur les cellules visibles, vous n'avez donc pas besoin de formater des cellules non visibles, mais vous les formatez plusieurs fois.

7
répondu Denise Skidmore 2013-02-25 19:50:42

Vous pouvez changer Backcolor ligne par ligne en utilisant votre condition.et cet appel de fonction après avoir appliqué Datasource de DatagridView.

Voici la fonction pour cela. Il suffit de copier cela et de le mettre après Databind

private void ChangeRowColor()
{
    for (int i = 0; i < gvItem.Rows.Count; i++)
    {
        if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD");
        else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9");
        else if (BindList[i].MainID > 0)
            gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7");
        else
            gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White;
    }
}
4
répondu pratik1020 2015-12-03 11:01:23
private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e)
{
    dtGrdVwRFIDTags.Refresh();
    this.dtGrdVwRFIDTags.Columns[1].Visible = false;

    foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows)
    {
        if (row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Lost" 
            || row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Damaged" 
            || row.Cells["TagStatus"].Value != null 
            && row.Cells["TagStatus"].Value.ToString() == "Discarded")
        {
            row.DefaultCellStyle.BackColor = Color.LightGray;
            row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
        }
        else
        {
            row.DefaultCellStyle.BackColor = Color.Ivory;
        }
    }  

    //for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++)
    //{
    //    if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged")
    //    {
    //        dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;                   
    //    }
    //}
}
3
répondu christopher 2015-12-03 10:59:06

C'est ma solution pour changer la couleur en dataGridView avec bindingDataSource:

private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{            

    if (e.ListChangedType != ListChangedType.ItemDeleted)
    {

        DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone();
        green.BackColor = Color.Green;

        DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone();
        gray.BackColor = Color.LightGray;



        foreach (DataGridViewRow r in this.dataGridViewECO.Rows)
        {

            if (r.Cells[8].Value != null)
            {

                String stato = r.Cells[8].Value.ToString();


                if (!" Open ".Equals(stato))
                {
                    r.DefaultCellStyle = gray;
                }
                else
                {
                    r.DefaultCellStyle = green;
                }
            }

        }

    }
}
1
répondu daniele3004 2015-10-07 07:42:20

Si vous vous liez à une (collection) d'objets concrets, vous pouvez obtenir cet objet concret via la propriété DataBoundItem de la ligne. (Pour éviter de vérifier les chaînes magiques dans la cellule et en utilisant les propriétés "réelles" de l'objet)

Exemple de squelette ci-dessous:

DTO / POCO

public class Employee
{
    public int EmployeeKey {get;set;}

    public string LastName {get;set;}

    public string FirstName {get;set;}

    public bool IsActive {get;set;}
}       

Liaison à datagridview

    private void BindData(ICollection<Employee> emps)
    {
        System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList());
        this.dgvMyDataGridView.DataSource = bindList;
    }       

Ensuite, le gestionnaire d'événements et l'obtention de l'objet concret (au lieu D'un DataGridRow et/ou des cellules)

        private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee;
            if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive)
            {
                dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
            }
        }
1
répondu granadaCoder 2017-04-25 15:51:00

J'aime généralement utiliser le GridView.RowDataBound événement événement pour cette.

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ForeColor = System.Drawing.Color.Red;
    }
}
0
répondu Edison 2013-03-18 21:36:56

Fonctionne sur Visual Studio 2010. (J'ai essayé et ça marche!!!) il va peindre toute votre ligne.

  1. Créez un bouton pour le datagridview.
  2. Créez un événement CellClick et placez la ligne de code suivante à l'intérieur.

if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)    
{
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
0
répondu Levi 2015-12-03 11:02:40

Vous n'avez pas mentionné comment la valeur est modifiée. J'ai utilisé des fonctionnalités similaires lorsque l'utilisateur entre une valeur. c'est-à-dire entrer et quitter le mode d'édition.

En utilisant CellEndEdit événement de datagridview.

private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    double newInteger;

    if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger)
    {
        if (newInteger < 0 || newInteger > 50)
        {
            dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red; 

            dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText 
                = "Keep value in Range:" + "0 to " + "50";
        }
    }                               
}

Vous pouvez ajouter une logique pour effacer la notification d'erreur d'une manière similaire.

Si dans votre cas, si les données sont chargées par programme, alors CellLeave event peut être utilisé avec le même code.

0
répondu Harshal Doshi Jain 2015-12-03 11:07:42

Avec ce code, vous ne modifiez rows backcolor que si la valeur columname est null.

       foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells["columnname"].Value != null)
                    {
                        dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
                    }
                 }
0
répondu bencemik95 2016-08-30 13:12:41

Juste une note sur le réglage DefaultCellStyle.BackColor...vous ne pouvez pas le définir sur une valeur transparente sauf Color.Empty. C'est la valeur par défaut. Cela implique faussement (pour moi, de toute façon) que les couleurs transparentes sont correctes. Ils ne sont pas. Chaque ligne que j'ai définie sur une couleur transparente dessine simplement la couleur des lignes sélectionnées.

J'ai passé tout à fait trop de temps à me battre la tête contre le mur sur cette question.

0
répondu ulatekh 2017-02-02 22:34:08

INT counter = gridEstimateSales.Rangée.Compter;

        for (int i = 0; i < counter; i++)
        {
            if (i == counter-1)
            {
                //this is where your LAST LINE code goes
                //row.DefaultCellStyle.BackColor = Color.Yellow;
                gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red;
            }
            else
            {
                //this is your normal code NOT LAST LINE
                //row.DefaultCellStyle.BackColor = Color.Red;
                gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White;
            }
        }
0
répondu Amit Patil 2017-08-17 09:02:32

J'ai atterri ici à la recherche d'une solution pour le cas où je n'utilise pas de liaison de données. Rien n'a fonctionné pour moi mais je l'ai eu à la fin avec:

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();
0
répondu Gogu CelMare 2018-06-08 02:12:22