none
Ordenar por fecha en una columna de un data grid view RRS feed

  • Pregunta

  • Hola.

    Tengo un Data Grid View con una columna tipo fecha en el formato "dd/MM/yyyy"

    Mi problema es que cuando ordenas por esa columna dando con el ratón en la cabecera de la columna no ordena por fecha sino alfanumericamente.

    Como puedo hacer que ordene por orden de fecha.

    Muchas gracias.

    domingo, 17 de enero de 2021 8:32

Respuestas

  • Bueno, que venga de un DataSet es normal, eso no tiene importancia. Pero hay dos formas de configurar el grid para que muestre los datos del DataSet. Se puede poner a true la propiedad AutoGenerateColumns (es el valor predeterminado), en cuyo caso infiere automáticamente las columnas que hay que mostrar a partir de las columnas que vienen del DataSet. O se puede poner la propiedad en false y entonces definir las columnas una por una (usando la propiedad Columns bien sea desde código o desde el diseñador). En este último caso, se puede asignar la propiedad Format directamente en el diseñador. En cambio, si las columnas se han inferido automáticamente, el formato tendrías que cambiarlo por código si es que no te sirve el predeterminado. En ese caso, al poner dataGridView1.Columns("MiColumna").DefaultCellStyle.Format lo que hay que poner en MiColumna es el nombre que se haya inferido desde el DataSet, que no tiene por qué coincidir con el título que se ve en pantalla para la columna. Si es necesario, puedes acceder a ella por posición, por ejemplo, Columns(3) si es la cuarta columna (recuerda que empiezan en cero). Esto hay que hacerlo después de que se hayan cargado las columnas.
    • Propuesto como respuesta EricRRModerator martes, 19 de enero de 2021 20:19
    • Marcado como respuesta Jesusvb martes, 26 de enero de 2021 16:26
    domingo, 17 de enero de 2021 11:41
  • ¡Aghs! Puede ser que, como en ese momento ya está cargada de datos, aunque cambies el formato no se re-formatee, sino que siga visualizando el formato que ya existía antes. Esto no pasa cuando aplicas el formato a la columna antes de cargarla de datos, pero claro, para eso no puede ser auto-generada durante la carga de datos, tendría que estar predefinida antes.

    Si no quieres predefinirla, otra alternativa (un poco más complicada) sería implementar un manejador para el evento CellFormatting (o algo parecido -- no recuerdo de memoria el nombre exacto del evento, pero te lo dice Visual Studio), y entonces aplicar el formato deseado cuando se dispare ese evento.

    • Propuesto como respuesta EricRRModerator martes, 19 de enero de 2021 20:18
    • Marcado como respuesta EricRRModerator viernes, 22 de enero de 2021 17:39
    domingo, 17 de enero de 2021 18:07

Todas las respuestas

  • Casi seguro que esto te pasa porque NO tienes una columna tipo fecha, sino que la columna es de tipo string, y en el string le has metido el resultado de formatear la fecha. Entonces el DataGridView no "sabe" que eso es una fecha, sino que lo considera string y lo ordena alfabéticamente.

    Puedes solucionarlo asegurándote de que la columna es de tipo DateTime (no de tipo String) y metiéndole la fecha en formato binario (el propio DateTime sin aplicarle formato ni convertirlo a String). Después de eso, te la ordenará correctamente por orden cronológico en lugar de orden alfabético.

    Si te encuentras con que entonces no te la visualiza en el formato que tú quieres, puedes forzarlo aplicándole la propiedad Format:

     dataGridView1.Columns("MiColumna").DefaultCellStyle.Format = "dd/MM/yyyy"

    • Propuesto como respuesta EricRRModerator martes, 19 de enero de 2021 20:19
    domingo, 17 de enero de 2021 9:33
  • Gracias por tú respuesta, la he entendido muy bien.

    Al hacerlo como dices me ordena perfectamente pero no lo veo correctamente al hacer el:

    dataGridView1.Columns("MiColumna").DefaultCellStyle.Format = "dd/MM/yyyy"

    Puede ser porque el data grid biene de un dataset?

     DGVxxx.DataSource = DsBD.Tables("XXXX")

    Un saludo.

    domingo, 17 de enero de 2021 11:26
  • Bueno, que venga de un DataSet es normal, eso no tiene importancia. Pero hay dos formas de configurar el grid para que muestre los datos del DataSet. Se puede poner a true la propiedad AutoGenerateColumns (es el valor predeterminado), en cuyo caso infiere automáticamente las columnas que hay que mostrar a partir de las columnas que vienen del DataSet. O se puede poner la propiedad en false y entonces definir las columnas una por una (usando la propiedad Columns bien sea desde código o desde el diseñador). En este último caso, se puede asignar la propiedad Format directamente en el diseñador. En cambio, si las columnas se han inferido automáticamente, el formato tendrías que cambiarlo por código si es que no te sirve el predeterminado. En ese caso, al poner dataGridView1.Columns("MiColumna").DefaultCellStyle.Format lo que hay que poner en MiColumna es el nombre que se haya inferido desde el DataSet, que no tiene por qué coincidir con el título que se ve en pantalla para la columna. Si es necesario, puedes acceder a ella por posición, por ejemplo, Columns(3) si es la cuarta columna (recuerda que empiezan en cero). Esto hay que hacerlo después de que se hayan cargado las columnas.
    • Propuesto como respuesta EricRRModerator martes, 19 de enero de 2021 20:19
    • Marcado como respuesta Jesusvb martes, 26 de enero de 2021 16:26
    domingo, 17 de enero de 2021 11:41
  • Hola Alberto.

    Así lo hago, cargo el dataset en el DGV, sale la columna como yyyy-MM-dd, funcionando la ordenación.

    Después ejecuto :
            DGVxxx.Columns(1).DefaultCellStyle.Format = "dd/MM/yyyy"

    Pero la columna no hace nada.

    Un saludo.


    • Editado Jesusvb domingo, 17 de enero de 2021 15:46
    domingo, 17 de enero de 2021 15:28
  • ¡Aghs! Puede ser que, como en ese momento ya está cargada de datos, aunque cambies el formato no se re-formatee, sino que siga visualizando el formato que ya existía antes. Esto no pasa cuando aplicas el formato a la columna antes de cargarla de datos, pero claro, para eso no puede ser auto-generada durante la carga de datos, tendría que estar predefinida antes.

    Si no quieres predefinirla, otra alternativa (un poco más complicada) sería implementar un manejador para el evento CellFormatting (o algo parecido -- no recuerdo de memoria el nombre exacto del evento, pero te lo dice Visual Studio), y entonces aplicar el formato deseado cuando se dispare ese evento.

    • Propuesto como respuesta EricRRModerator martes, 19 de enero de 2021 20:18
    • Marcado como respuesta EricRRModerator viernes, 22 de enero de 2021 17:39
    domingo, 17 de enero de 2021 18:07
  • Hola Jesus,

    ¿Alguna novedad sobre la consulta realizada?

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 18 de enero de 2021 15:23
    Moderador
  • Hola Eric.

    Sigo intentándolo pero no doy con ello.

    Un saludo.

    lunes, 18 de enero de 2021 18:57
  • Hola.

    Al final he tenido que configurar yo el Data Grid View no cargandolo directamente del Dataset, es más tiempo pero funciona.

    Gracias Alberto.

    Un saludo.

    martes, 26 de enero de 2021 16:26