¿Cómo cambiar el color de la fila en datagridview?

Me gustaría cambiar el color de una fila en particular en mi vista de cuadro de datos. La fila debe cambiarse a rojo cuando el valor de columncell 7 es menor que el valor en columncell 10. ¿Alguna sugerencia sobre cómo lograr esto?

Debe recorrer las filas en la vista de cuadrícula de datos y luego comparar los valores de las columnas 7 y 10 en cada fila.

Prueba esto:

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

Estaba investigando este problema (así que sé que esta pregunta se publicó hace casi 3 años, pero tal vez ayude a alguien …) pero parece que una mejor opción es colocar el código dentro del evento RowPrePaint para que no lo haga. Tengo que atravesar cada fila, solo las que se pintan (para que funcione mucho mejor con una gran cantidad de datos:

Adjuntar al evento

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

El código del 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; } } 

Está buscando el evento CellFormatting .
Aquí hay un ejemplo.

También tuve problemas para cambiar el color del texto: nunca vi el cambio de color.

Hasta que agregué el código para cambiar el color del texto al evento DataBindingsComplete para DataGridView . Después de eso funcionó.

Espero que esto ayude a las personas que enfrentan el mismo problema.

Algo como lo siguiente … suponiendo que los valores en las celdas son enteros.

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

no probado, así que me disculpo por cualquier error.

Si conoce la fila en particular, puede omitir la iteración:

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

A algunas personas les gusta usar los eventos Paint , CellPainting o CellFormatting , pero tenga en cuenta que cambiar un estilo en estos eventos provoca llamadas recursivas. Si usa DataBindingComplete , se ejecutará solo una vez. El argumento para CellFormatting es que se llama solo en celdas visibles, por lo que no tiene que formatear celdas no visibles, pero las formatea varias veces.

Puede cambiar Backcolor fila por fila usando su condición. Y esta función llama después de aplicar DatagridView of DatagridView .

Aquí está la función para eso. Simplemente copie eso y póngalo después de 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; } } 
 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 

Esta es mi solución para cambiar el color a dataGridView con 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; } } } } } 

Si se vincula a una (colección) de objetos concretos, puede obtener ese objeto concreto a través de la propiedad DataBoundItem de la fila. (Para evitar comprobar cadenas mágicas en la celda y usar propiedades “reales” del objeto)

Ejemplo de esqueleto a continuación:

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

Enlazando a la vista de cuadro de datos

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

luego, el controlador de eventos y obtener el objeto concreto (en lugar de un DataGridRow y / o celdas)

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

Normalmente me gusta usar el evento GridView.RowDataBound Event para esto.

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

Funciona en Visual Studio 2010. (¡Lo probé y funciona!) Pintará toda tu fila.

  1. Crea un botón para la vista de datagridview .
  2. Cree un evento CellClick y coloque la siguiente línea de código dentro de él.

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

No has mencionado cómo se cambia el valor. He usado una funcionalidad similar cuando el usuario está ingresando valor. es decir, entrar y salir del modo de edición.

Utilizando el evento CellEndEdit 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"; } } } 

Puede agregar lógica para borrar la notificación de error de una manera similar.

si en su caso, si los datos se cargan programáticamente, entonces el evento CellLeave se puede usar con el mismo código.

Con este código, solo cambia las filas de color posterior donde el valor de la columna es nulo, el color de otras filas sigue siendo el predeterminado.

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

Solo una nota sobre la configuración de DefaultCellStyle.BackColor … no se puede establecer en ningún valor transparente, excepto Color.Empty . Ese es el valor predeterminado. Eso implica falsamente (para mí, de todos modos) que los colores transparentes están bien. Ellos no están. Cada fila que configuro para un color transparente simplemente dibuja el color de las filas seleccionadas.

Pasé demasiado tiempo golpeando mi cabeza contra la pared por este problema.

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

Aterricé aquí buscando una solución para el caso en el que no utilizo el enlace de datos. Nada funcionó para mí, pero lo obtuve al final con:

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