2009-07-03 28 views
22

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 ahora, pero ciertamente no está funcionando, comenzando a preguntarse si necesito iterar sobre cada celda.C# Iterar sobre DataGridView y cambiar el color de fila

CÓDIGO:

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

¿Qué es "not working"? Sin filas? no se puede encontrar la celda? – Colin

Respuesta

5
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; 
      } 
     } 
    } 
+10

No gana nada haciendo [Tipo x = nulo; x = nuevo Tipo();]. Debería fusionar esas dos líneas en [Tipo x = nuevo Tipo();] –

25

gancho OnRowDataBound evento a continuación, hacer cosas

ASPX (Grid):

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

código subyacente:

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

Lo siento, esto es solo una aplicación WinForms recta ......... – Goober

+1

¡Uy! todo es tan web y yo mismo estoy metido en el proyecto web desde hace 3 meses que parece normal que todas las preguntas se refieran a asp.net – TheVillageIdiot

+0

¿alguien ha votado negativamente y no sabe por qué? – TheVillageIdiot

2

¿Es posible que hay espacios o algún otro carácter 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")) 
0

Esta es la solución para Windows Forms:

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

Sin excepción y sin cambio de color. No sé por qué necesita ayuda –

0

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 fundición como una cadena en lugar de llamar ToString no veo ninguna realidad diferencia por lo que podría ser un error de sensibilidad de caso. Trate de usar:

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

En su DataGridView, controlar el evento CellFormatting:

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting); 

Su controlador de eventos a continuación, podría tener este aspecto:

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 manera usted no está "iterar" sobre las filas, simplemente cambiando el color con el que se pintan/dibujan cuando se vuelven visibles (y por lo tanto, quire formatting) en la grilla.

+0

Este método es MUCHO más lento, pero el formato no se anula con un ordenamiento de encabezado de columna. –

+0

Disculpa, hubo un problema con la sustitución del código del controlador de eventos y no puedo editar mi comentario anterior. Reemplazaría 'MUCHO' con 'algo' más lento. –

+0

Dependiendo de lo que esté haciendo en el controlador, va a aprovechar al máximo esa determinación (de rendimiento). Sin embargo, al final, usar el método del controlador significa que (como dices) no se borrará por la clasificación de columnas. Pero también que en el caso de una cuadrícula con miles de filas, no está "formateando" filas que el usuario nunca verá de todos modos. – Rostov

0
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; 
} 
+1

Bienvenido a stackoverflow. Sugerencia, puede usar el botón '{}' para formatear sus fragmentos de código. – Leigh

Cuestiones relacionadas