valor una seleccionada segĂșn net filas fila encabezado columna color celda cambiar c# winforms datagridview row loops

una - cambiar color fila seleccionada datagridview c#



C#Iterar sobre DataGridView y cambiar el color de la fila (7)

Tengo una vista de cuadrícula de datos formada por varias filas y columnas. Quiero iterar a través de cada fila y verificar el contenido de una columna específica. Si esa columna contiene la palabra "NO", quiero cambiar el color de la fila completa a Rojo. Aquí hay un intento de algún código hasta el momento, pero ciertamente no está funcionando, comenzando a preguntarse si necesito iterar sobre cada celda.

CÓDIGO:

foreach (DataGridViewRow dgvr in dataGridView1.Rows) { if (dgvr.Cells["FollowedUp"].Value.ToString() == ("No")) { dgvr.DefaultCellStyle.ForeColor = Color.Red; } }


¿Es posible que haya espacios o algún otro personaje como parte del valor de la celda? Si es así, intente utilizar el método Contiene en lugar de la igualdad directa.

if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No"))


En su DataGridView, maneje el evento CellFormatting:

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);

Su controlador de eventos podría verse así:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if(dataGridView1.Columns[e.ColumnIndex].Name == "FollowedUp" && e.Value != null && e.Value.ToString() == "No") dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red; }

De esta forma, no está ''iterando'' sobre las filas, simplemente cambiando el color con el que están pintadas / dibujadas cuando se vuelven visibles (y por lo tanto requieren formato) en la cuadrícula.


Esta es la solución para Winforms:

private void HighlightRows() { DataGridViewCellStyle GreenStyle = null; if (this.dgridv.DataSource != null) { RedCellStyle = new DataGridViewCellStyle(); RedCellStyle.BackColor = Color.Red; for (Int32 i = 0; i < this.dgridv.Rows.Count; i++) { if (((DataTable)this.dgridv.DataSource).Rows[i]["col_name"].ToString().ToUpper() == "NO") { this.dgridv.Rows[i].DefaultCellStyle = RedCellStyle; continue; } } } }


Este código funciona bien para mí:

foreach (DataGridViewRow row in dataGridView1.Rows) { if ((string)row.Cells["property_name"].Value == UNKNOWN_PROPERTY_NAME) { row.DefaultCellStyle.BackColor = Color.LightSalmon; row.DefaultCellStyle.SelectionBackColor = Color.Salmon; } }

Aparte de lanzar como una cadena en lugar de llamar a ToString, realmente no veo ninguna diferencia, por lo que podría ser un error de sensibilidad de mayúsculas y minúsculas. Intenta usar:

dgvr.Cells["FollowedUp"].Value.ToString().ToUpper() == "NO"


conectar el evento OnRowDataBound y luego hacer las cosas

ASPX (Cuadrícula):

<asp:.... OnRowDataBound="RowDataBound"..../>

Código detrás:

protected void RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowIndex == -1) { return; } if(e.Row.Cells[YOUR_COLUMN_INDEX].Text=="NO"){ e.Row.BackColor=Color.Red; } }

PARA WinForms:

hook the **DataBindingComplete** event and do stuff in it: private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (e.ListChangedType != ListChangedType.ItemDeleted) { DataGridViewCellStyle red = dataGridView1.DefaultCellStyle.Clone(); red.BackColor=Color.Red; foreach (DataGridViewRow r in dataGridView1.Rows) { if (r.Cells["FollowedUp"].Value.ToString() .ToUpper().Contains("NO")) { r.DefaultCellStyle = red; } } } }


private void Grd_Cust_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { colorCode == 4 ? Color.Yellow : Color.Brown; if (e.RowIndex < 0 || Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value == DBNull.Value) return; string colorCode = Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value.ToString(); e.CellStyle.BackColor = colorCode == "NO" ? Color.Red : Grd_Cust.DefaultCellStyle.BackColor; }


public void ColourChange() { DataGridViewCellStyle RedCellStyle = null; RedCellStyle = new DataGridViewCellStyle(); RedCellStyle.ForeColor = Color.Red; DataGridViewCellStyle GreenCellStyle = null; GreenCellStyle = new DataGridViewCellStyle(); GreenCellStyle.ForeColor = Color.Green; foreach (DataGridViewRow dgvr in dataGridView1.Rows) { if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) { dgvr.DefaultCellStyle = RedCellStyle; } if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("Yes")) { dgvr.DefaultCellStyle = GreenCellStyle; } } }