none
Color individual celdas DataGridView RRS feed

  • Pregunta

  • Hola buenas a todos.

    Tengo un datagridview en el que cargo los datos de una consulta linq sql, una de las columnas es un valor fecha y quiero que recorriendo las celdas del grid las que están entre un rango de fechas se pongan en otro color.

                for (int i = 0; i < dataGridView1.RowCount; i++)
                {
                    if (Convert.ToDateTime(dataGridView1[6, i].Value) < DateTime.Today.AddDays(30) && Convert.ToDateTime(dataGridView1[6, i].Value) >= DateTime.Today)
                    {

                        dataGridView1.Rows[i].Cells[3].Style.BackColor = Color.Red;
                        dataGridView1[1, 3].Style.BackColor = Color.Red;
                    }
                }

    Por alguna razón que no se, no lo hace. Pueden decirme si hay algo que no estoy teniendo en cuenta.

    Un saludo

    martes, 27 de junio de 2017 17:35

Respuestas

  • ¿En qué momento pintas, según condición, las celdas?. Intenta pintar las celdas cuando se produce el evento 'CellFormatting', por ejemplo:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
    	var dgv = sender as DataGridView;
    
    	if (dgv.Columns[e.ColumnIndex].Name == "NomColFecha")
    	{
    		if (Convert.ToDateTime(e.Value).CompareTo(DateTime.Today.Date) >= 0 
    		&& Convert.ToDateTime(e.Value).CompareTo(DateTime.Today.AddDays(30).Date) <= 0)
    		{
    			dgv.Rows[e.RowIndex].Cells["NomCol"].Style.BackColor = Color.Red;
    		}
    	}
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 17:34
    jueves, 29 de junio de 2017 16:46
  •   public Form1()
            {
                InitializeComponent();
    
                DataTable tabla = new DataTable();
                tabla.Columns.Add("Datos1", typeof(int));
                tabla.Columns.Add("Datos2", typeof(string));
                tabla.Columns.Add("Fecha", typeof(DateTime));
                tabla.Rows.Add(new object[] { 1, "Prueba 1", "02/06/2017" });
                tabla.Rows.Add(new object[] { 2, "Prueba 2", "01/01/2017" });
                tabla.Rows.Add(new object[] { 3, "Prueba 3", "28/06/2017" });
    
                dataGridView1.DataSource = tabla;
                
     }
     private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
            {
                DateTime fecha1 = Convert.ToDateTime("01/06/2017");
                DateTime fecha2 = Convert.ToDateTime("30/06/2017");
    
                for (int i = 0; i < dataGridView1.RowCount; i++)
                {
                    DateTime fecha = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);
    
                    if ((fecha >= fecha1) && (fecha <= fecha2))
                    {
                        dataGridView1.Rows[i].Cells[2].Style.BackColor = Color.Red;
                        
                    }
                }
            }

    estuve realizando unas pruebas espero te sirva

    agrego link para ver resultado https://1drv.ms/i/s!AhgljJmIXJH-gQzfb0P7MmjZXnWZ

    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 16:42
    jueves, 29 de junio de 2017 16:11
  • Pon el código en en evento Shown del formulario y asegúrate de que no se ejecuta posteriormente ningún código que vuelva a modificar el color de las celdas.

    Saludos, Javier J

    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 16:42
    jueves, 29 de junio de 2017 16:18

Todas las respuestas

  • Estás usando el operador "&&" que se corresponde a la lógica "and".

    No se puede cumplir la condición de que la fecha sea anterior a 30 días antes que hoy Y a la vez sea posterior a hoy

    Tendrás que cambiar la condición a "or".


    Saludos, Javier J

    jueves, 29 de junio de 2017 11:11
  • Hola, gracias por responder.

    Mi objetivo es colorear las fechas que están entre hoy y de hoy en 30 días, por eso pongo que sea menor a hoy más 30 días y mayor que el día de hoy para quitar las fechas pasadas.

    Creo que es así la condición, con "or" saldrían todos. No es así?

    jueves, 29 de junio de 2017 14:34
  • Tienes razón, no había visto bien las 2 condiciones.

    ¿Qué valores tienes en la columna 6 del dataGrid?

    ¿En que punto ejecutas esas instrucciones?


    Saludos, Javier J

    jueves, 29 de junio de 2017 15:13
  • La columna 6 del dataGrid son fechas estás en concreto:

    13/06/2017   29/06/2017   02/07/2017   17/07/2017   15/09/2017 Con lo cual se que hay 3 que si cumplen la condición.

    Al iniciar el formulario llamo a un metodo que cargar una consulta linq en el grid asignando a la propiedad datasource esa consulta y a continuación es cuando recorre los valores de las celdas para aplicar el color.

    Curiosamente si depuro el codigo con visual studio veo que donde se cumple la condición si que entra en el if y pasa por la linea.

    No se si es por alguna propiedar que se solapa o algo.

    Gracias

    jueves, 29 de junio de 2017 15:47
  •   public Form1()
            {
                InitializeComponent();
    
                DataTable tabla = new DataTable();
                tabla.Columns.Add("Datos1", typeof(int));
                tabla.Columns.Add("Datos2", typeof(string));
                tabla.Columns.Add("Fecha", typeof(DateTime));
                tabla.Rows.Add(new object[] { 1, "Prueba 1", "02/06/2017" });
                tabla.Rows.Add(new object[] { 2, "Prueba 2", "01/01/2017" });
                tabla.Rows.Add(new object[] { 3, "Prueba 3", "28/06/2017" });
    
                dataGridView1.DataSource = tabla;
                
     }
     private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
            {
                DateTime fecha1 = Convert.ToDateTime("01/06/2017");
                DateTime fecha2 = Convert.ToDateTime("30/06/2017");
    
                for (int i = 0; i < dataGridView1.RowCount; i++)
                {
                    DateTime fecha = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);
    
                    if ((fecha >= fecha1) && (fecha <= fecha2))
                    {
                        dataGridView1.Rows[i].Cells[2].Style.BackColor = Color.Red;
                        
                    }
                }
            }

    estuve realizando unas pruebas espero te sirva

    agrego link para ver resultado https://1drv.ms/i/s!AhgljJmIXJH-gQzfb0P7MmjZXnWZ

    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 16:42
    jueves, 29 de junio de 2017 16:11
  • Pon el código en en evento Shown del formulario y asegúrate de que no se ejecuta posteriormente ningún código que vuelva a modificar el color de las celdas.

    Saludos, Javier J

    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 16:42
    jueves, 29 de junio de 2017 16:18
  • Nada no funciona, lo he puesto tal y cómo tú indicas y no hay forma. Depuro paso a paso y entra en la condición if pero no la aplica.

    He añadido esta línea solo para probar si lo hacía y el caso es que el estilo por defecto si que lo aplica.

    dataGridView1.DefaultCellStyle.BackColor = Color.LightBlue;

    Desconozco que propiedad puede ser, pero no creo que el error este en la condición o el bucle, más bien pienso que es algo que machaca la propiedad o impide que se modifique en tiempo ejecución o algo de ese estilo.

    jueves, 29 de junio de 2017 16:23
  • Listo gracias por la ayuda, digamos que no he descubierto donde estaba el error pero he creado un metodo con el codigo que cambia el color y lo llamo desde un evento del grid que tiene luegar cuado se alteran sus valores.

    No se que parte del codigo machacaba antes mi código pero así arreglado.

    jueves, 29 de junio de 2017 16:44
  • ¿En qué momento pintas, según condición, las celdas?. Intenta pintar las celdas cuando se produce el evento 'CellFormatting', por ejemplo:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
    	var dgv = sender as DataGridView;
    
    	if (dgv.Columns[e.ColumnIndex].Name == "NomColFecha")
    	{
    		if (Convert.ToDateTime(e.Value).CompareTo(DateTime.Today.Date) >= 0 
    		&& Convert.ToDateTime(e.Value).CompareTo(DateTime.Today.AddDays(30).Date) <= 0)
    		{
    			dgv.Rows[e.RowIndex].Cells["NomCol"].Style.BackColor = Color.Red;
    		}
    	}
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta PedroReyes jueves, 29 de junio de 2017 17:34
    jueves, 29 de junio de 2017 16:46