web-dev-qa-db-fra.com

Comment changer la couleur de la 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 la cellule de colonne 7 est inférieure à la valeur de la cellule de colonne 10. Des suggestions sur la manière de procéder?

120
EB.

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

Essaye ç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; 
     }
169
Ricardo Sanchez

J'étais justement en train d'enquêter sur ce problème (je sais donc que cette question a été publiée il y a près de 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 ne l'ayez pas Il n’est pas nécessaire de parcourir chaque ligne, uniquement celles qui sont peintes (ainsi, les performances seront bien meilleures avec 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;
    }
}
53
Eden

Vous recherchez l'événement CellFormatting .
Ici est un exemple.

22
SLaks

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

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

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

21
user1614017

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 des excuses pour toute erreur.

Si vous connaissez la ligne en particulier, 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
Demi

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

7
Denise Skidmore

Vous pouvez modifier Backcolor ligne par ligne à l'aide de votre condition.et cet appel de fonction après l'application de Datasource sur DatagridView.

Voici la fonction pour cela . Copiez-le simplement et mettez-le 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
pratik1020
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
christopher

Voici 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
daniele3004

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 rechercher des chaînes magiques dans la cellule et d'utiliser 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 à la 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;
    }       

puis le gestionnaire d'événement et obtenir l'objet concret (au lieu d'un DataGridRow et/ou de 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
granadaCoder

J'aime généralement utiliser l'événement événement GridView.RowDataBound pour cela.

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ForeColor = System.Drawing.Color.Red;
    }
}
0
Edison

Avec ce code, vous ne modifiez que les lignes backcolor où la valeur columname est null, les autres lignes sont toujours la couleur par défaut.

       foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells["columnname"].Value != null)
                    {
                        dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
                    }
                 }
0
bencemik95

Juste une remarque sur la définition de DefaultCellStyle.BackColor... vous ne pouvez pas lui attribuer une valeur transparente sauf Color.Empty. C'est la valeur par défaut. Cela implique faussement (pour moi, en tout cas) que les couleurs transparentes sont acceptables. Ils ne sont pas. Chaque ligne que je mets sur une couleur transparente dessine simplement la couleur des lignes sélectionnées.

J'ai passé trop de temps à me cogner la tête contre ce problème.

0
ulatekh

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

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();
0
Gogu CelMare

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

Utiliser CellEndEdit event 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
Harshal Doshi Jain

int counter = gridEstimateSales.Rows.Count;

        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
Amit Patil

Fonctionne sur Visual Studio 2010. (Je l'ai essayé et cela fonctionne!) Il peindra toute votre ligne.

  1. Créez un bouton pour la datagridview.
  2. Créez un événement CellClick et placez-y la ligne de code suivante.

if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)    
{
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
0
Levi