2012-03-02 17 views
11

Quiero cambiar el color de fondo de la fila de la DGV en función de las condiciones particulares de carga incluso en Windows Form. Pero no puedo ver ningún cambio de color en la fila de ningún DGV. ¿Alguien podría decirme cómo puedo resolver este problema?El color de fondo de la fila DataGridView no cambia

private void frmSecondaryPumps_Load(object sender, EventArgs e) 
{ 
      try 
      { 
       DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper()); 
       dataGridView1.DataSource = dt; 

       foreach (DataGridViewRow row in dataGridView1.Rows) 
       { 
        foreach (DataGridViewColumn column in dataGridView1.Columns) 
        { 
         if (row.Cells[column.Name] != null) 
         { 
          if (row.Cells[column.Name].Value.ToString() == "ON") 
           row.DefaultCellStyle.BackColor = System.Drawing.Color.Green; 

          if (row.Cells[column.Name].Value.ToString() == "OFF") 
           row.DefaultCellStyle.BackColor = System.Drawing.Color.Red; 
         } 
        } 
       } 

       dataGridView1.Refresh(); 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show(err.Message); 
      } 
     } 
+1

por qué no establecer' BackColor' en lugar de 'ForeColor' – V4Vendetta

+0

He intentado esto así, pero no puedo' ver cualquier cambio en el color de la fila en cualquier fila de DGV – Stardust

Respuesta

11

Creo que el mejor lugar sería para establecer el BackColor en el caso de la CellFormattingDataGridView, algo en estas líneas.

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index 
    // check the cell value under your specific column and then you can toggle your colors 
    row.DefaultCellStyle.BackColor = Color.Green; 
} 
+0

¡Gracias! ¡Ha funcionado! – Stardust

+4

Como dice King_Rob más abajo, Cellformatting activará continuamente el evento incluso cuando se desplaza. Úselo con precaución. – henry

+0

Ese evento múltiple disparado. –

9

Uno de los problemas con el uso de cualquiera de las cellformatting, databindingcomplete o incluso paint eventos es que son despedidos en múltiples ocasiones. Por lo que he reunido, existe un problema con el control datagridview en el que no se puede cambiar el color de ninguna de las celdas hasta DESPUÉS de que se haya mostrado el formulario. Por lo tanto, los métodos que se ejecutan o los eventos que se activan antes de llamar al Shown() no cambiarán el color. Los eventos que están ubicados como la solución al problema generalmente funcionan, pero dado que se llaman muchas veces, puede que no sea la respuesta más eficiente.

Probablemente la solución más simple al problema es poner su código para rellenar/colorear sus cuadrículas en el método Shown() de su formulario en lugar del constructor. Debajo hay un enlace a una publicación en los foros de msdn que me avisó de la solución, que está marcada como la respuesta de aproximadamente 3/4 del camino hacia abajo en la página.

MSDN forums post with the Solution

+0

Esta debería ser la respuesta correcta. Y solo para agregar detalles de implementación: use el evento Load para establecer un marcador y luego el evento Visible para establecer el color de fondo. – Daltons

+0

Esta es la RESPUESTA correcta. Mejora el rendimiento ya que no dispara varias veces como lo hace al usar el formateo de celdas y otros controladores – Anand

0

Lo siento por la respuesta tardía pero sólo estoy mirando exactamente el mismo problema ahora.

que tienen alguna solución general para las cosas que no funcionan correctamente en el constructor - utilizan un temporizador

Conjunto durante algún tiempo corto como 100 ms. A continuación, en el constructor tendrá

timer1.Enabled=true 

y en caso timer_Tick:

timer1.Enabled=false 

and all the code that doesn't work in constructor goes here... 

que trabajó para mí cada vez.

3

King_Rob es correcto. Tuve el mismo problema, así que solo publicaré mi implementación ya que las otras sugerencias aquí están lejos de ser óptimas.

Añadir los manipuladores de eventos (en el diseñador o constructor):

this.Load += UserControl_Load; // or form or any control that is parent of the datagridview 
dataGridView1.VisibleChanged += DataGridView1_VisibleChanged; 

En el método lanzador evento de carga añadir una bandera

private bool _firstLoaded; 
private void UserControl_Load(object sender, EventArgs e) 
{ 
    _firstLoaded = true; 
} 

Y finalmente en el visible manejador de eventos:

private void DataGridView1_VisibleChanged(object sender, EventArgs e) 
{ 
    if (_firstLoaded && dataGridView1.Visible) 
    { 
     _firstLoaded = false; 
     // your code 
    } 
} 
+0

¡Respuesta menos hacky! ¡Gracias! –

-1

¡Este código es rápido, fácil y no consume memoria!

utilizar este código, por ejemplo, dentro del evento CellEndEdit

`try{ 
//your code 
} 
catch(Exception){ 
//your exception 
} 
finally{ 
yourDataGridView.Visible = false; 
yourDataGridView.Visible = true; 
} 

`

+0

¿cómo eso ayuda al usuario? – gmetax

+0

Tal vez es lo mismo que con otros productos de Microsoft y un apagado y reinicio ('Visible = falso; Visible = verdadero') ayuda de hecho? – derM

+0

Si funciona (y me funciona) significa que ayuda. ¿estas de acuerdo conmigo? – SCG

Cuestiones relacionadas