c# - value - Como mudar a cor da linha no datagridview?




c# datagridview row color (12)

Algo como o seguinte ... assumindo que os valores nas células são inteiros.

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

não testado, então peço desculpas por qualquer erro.

Se você conhece a linha específica, pode pular a iteração:

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

Eu gostaria de mudar a cor de uma linha particular no meu datagridview. A linha deve ser alterada para vermelho quando o valor da célula da coluna 7 for menor que o valor da célula da coluna 10. Alguma sugestão sobre como fazer isso?


Algumas pessoas gostam de usar os eventos Paint , CellPainting ou CellFormatting , mas observe que a alteração de um estilo nesses eventos causa chamadas recursivas. Se você usar DataBindingComplete ele será executado apenas uma vez. O argumento para CellFormatting é que ele é chamado apenas em células visíveis, portanto, você não precisa formatar células não visíveis, mas formate-as várias vezes.


Cheguei aqui procurando uma solução para o caso em que não utilizo vinculação de dados. Nada funcionou para mim, mas eu consegui no final com:

dataGridView.Columns.Clear(); 
dataGridView.Rows.Clear();
dataGridView.Refresh();

Com este código, você só altera as linhas de backcolor, onde o valor do nome da coluna é nulo, e as outras cores ainda são as padrão.

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

Eu estava apenas investigando esse problema (então eu sei que essa questão foi publicada há quase 3 anos, mas talvez ajude alguém ...) mas parece que a melhor opção é colocar o código dentro do evento RowPrePaint para que você não o faça. Não tenho que atravessar todas as linhas, apenas aquelas que são pintadas (então, ele terá um desempenho muito melhor em uma grande quantidade de dados:

Anexar ao evento

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

O código do evento

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

Eu normalmente gosto de usar o evento de evento GridView.RowDataBound para isso.

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

Se você se vincular a uma (coleção) de objetos concretos, poderá obter o objeto concreto por meio da propriedade DataBoundItem da linha. (Para evitar a verificação de seqüências mágicas na célula e usando propriedades "reais" do objeto)

Exemplo de esqueleto abaixo:

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

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

então o manipulador de eventos e obtendo o objeto concreto (em vez de um DataGridRow e / ou células)

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

Também tive problemas para alterar a cor do texto - nunca vi a mudança de cor.

Até que eu adicionei o código para alterar a cor do texto para o evento DataBindingsComplete para DataGridView . Depois disso, funcionou.

Espero que isso ajude as pessoas que enfrentam o mesmo problema.


Você não mencionou como o valor é alterado. Eu usei uma funcionalidade semelhante quando o usuário está inserindo valor. ou seja, entrar e sair do modo de edição.

Usando o evento CellEndEdit do 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";
        }
    }                               
}

Você pode adicionar lógica para limpar a notificação de erro de maneira semelhante.

se no seu caso, se os dados forem carregados programaticamente, o evento CellLeave poderá ser usado com o mesmo código.


Você pode alterar o Backcolor linha por linha usando sua condição e esta chamada de função depois de aplicar a Datasource de DatagridView do DatagridView .

Aqui está a função para isso. Basta copiar isso e colocá-lo após a 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;
    }
}

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

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




background-color