Как изменить цвет строки в datagridview? - PullRequest
127 голосов
/ 03 февраля 2010

Я хотел бы изменить цвет определенной строки в моем представлении данных. Строка должна быть изменена на красный, если значение columncell 7 меньше значения в columncell 10. Есть предложения о том, как этого добиться?

Ответы [ 17 ]

175 голосов
/ 03 февраля 2010

Необходимо выполнить цикл по строкам в представлении данных, а затем сравнить значения столбцов 7 и 10 в каждой строке.

Попробуйте это:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
     if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
     {
         row.DefaultCellStyle.BackColor = Color.Red; 
     }
55 голосов
/ 21 октября 2012

Я только что исследовал эту проблему (поэтому я знаю, что этот вопрос был опубликован почти 3 года назад, но, может быть, он кому-нибудь поможет ...), но, похоже, лучше разместить код внутри события RowPrePaint чтобы вам не приходилось обходить каждую строку, только те, которые были нарисованы (поэтому при больших объемах данных он будет работать намного лучше:

Прикрепить к событию

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

Код события

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;
    }
}
22 голосов
/ 03 февраля 2010

Вы ищете событие CellFormatting.
Здесь является примером.

21 голосов
/ 26 ноября 2012

У меня тоже были проблемы с изменением цвета текста - я никогда не видел изменения цвета.

Пока я не добавил код для изменения цвета текста на событие DataBindingsComplete для DataGridView. После этого это сработало.

Надеюсь, это поможет людям, столкнувшимся с той же проблемой.

13 голосов
/ 03 февраля 2010

Примерно так: при условии, что значения в ячейках являются целыми числами.

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

не проверено, поэтому извиняюсь за любую ошибку.

Если вы знаете конкретную строку, вы можете пропустить итерацию:

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
  dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
7 голосов
/ 25 февраля 2013

Некоторым людям нравится использовать события Paint, CellPainting или CellFormatting, но имейте в виду, что изменение стиля в этих событиях вызывает рекурсивные вызовы. Если вы используете DataBindingComplete, он будет выполнен только один раз. Аргумент для CellFormatting заключается в том, что он вызывается только для видимых ячеек, поэтому вам не нужно форматировать невидимые ячейки, но вы форматируете их несколько раз.

5 голосов
/ 01 октября 2014

Вы можете изменить Backcolor строка за строкой, используя ваше условие. И этот вызов функции после применения Datasource из DatagridView.

Вот функция для этого. Просто скопируйте это и поставьте после 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;
    }
}
3 голосов
/ 03 декабря 2010
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;                   
    //    }
    //}
}
1 голос
/ 25 апреля 2017

Если вы привязываетесь к (коллекции) конкретных объектов, вы можете получить этот конкретный объект через свойство DataBoundItem строки.(Чтобы избежать проверки наличия магических строк в ячейке и использования «реальных» свойств объекта)

Пример скелета ниже:

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;}
}       

Привязка к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;
    }       

затем обработчик события и получение конкретного объекта (вместо DataGridRow и / или ячеек)

        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 голос
/ 07 октября 2015

Это мое решение изменить цвет на dataGridView с 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;
                }
            }

        }

    }
}
...