Comportamiento extraño con el formato de fechas en los GridView

Cuando estamos usando un GridView para mostrar datos obtenidos de una base de datos resulta muy cómodo usar el editor de columnas para definir cómo se deben mostrar los datos en el listado que se genera.


Una propiedad muy interesante de las columnas enlazadas en DataFormatString, que nos permite decidir qué estilo queremos aplicar a las columnas.


Sin embargo con los campos que contienen fechas pasa unacosa muy rara…


Si tenemos un campo que es una Fecha y definimos una columna enlazada de modo similar a este:



<asp:BoundField DataField=“FechaFin” DataFormatString=“{0:d}” HeaderText=“Final”>


esperaremos ver algo similar a lo siguiente en la columna: 13/7/2006.


Sin embargo por más que cambiemos el formato veremos algo como esto: 13/7/2006 00:00:00


Es decir, no hace caso y mete el formato de fecha y hora cortas.


Si queremos que una columna de tipo fecha haga caso al formato tenemos dos soluciones:



1.- Convertirla en una plantilla. Con esto funcionará sin problemas el formato.


2.- Usar el atributo HtmlEncode con el valor ‘false’, así:



<asp:BoundField DataField=“FechaFin” DataFormatString=“{0:d}” HtmlEncode=“false” HeaderText=“Final”>


Con este último conseguiremos el resultado esperado.


Este problema puede volver loco a más de uno ya que no es nada obvio. Así que espero que os sirva de algo 🙂


NOTA: Explicación de este efecto a raíz del requerimiento de un lector…


Aquí está el código del método FormatDataValue de la clase BoundColumn que es el que se encarga de renderizar el contenido de la celda (extraido con NetReflector):


protected virtual string FormatDataValue(object dataValue, bool encode)
{
  string text1 = string.Empty;
  if (!DataBinder.IsNull(dataValue))
  {
    string text2 = dataValue.ToString();
    string text3 = this.DataFormatString;
    int num1 = text2.Length;
    if ((num1 > 0) && encode)
    {
      text2 = HttpUtility.HtmlEncode(text2);
    }
    if ((num1 == 0) && this.ConvertEmptyStringToNull)
    {
      return this.NullDisplayText;
    }
    if (text3.Length == 0)
    {
      return text2;
    }
    if (encode)
    {
      return string.Format(CultureInfo.CurrentCulture, text3, new object[] { text2 });
    }
    return string.Format(CultureInfo.CurrentCulture, text3, new object[] { dataValue });
  }
  return this.NullDisplayText;
}


Si te fijas, cuando se escoge la opción de formatear el contenido (HtmlEncode = true, valor por defecto), el valor de codificación se obtiene de la representación de texto del valor (text2, que si te fijas arriba es dataValue.ToString(). Esto hace que en el caso de las fechas el valor tenga al final la hora también, con lo que en el último condicional se usa para dar formato al texto. Si desactivas la codificación la cadena para la celda se genera directamente desde el valor del dato con el formato especificado, sin pasarlo a texto antes.


Para mi esto es un “bug” que deberían corregir porque se debería obtener el mismo resultado por los dos caminos.

Sin categoría

15 thoughts on “Comportamiento extraño con el formato de fechas en los GridView

  1. La verdad es que es un buen truco, yo me encontré ese problema hace un par de meses y opté por formatear mediante una plantilla, pero con este pequeño truco puedes ahorrarte las molestias de tener que hacerlo.
    La verdad es que yo también me pasé un buen rato intentando comprender el porqué de esto.

    Muchas gracias por el apunte.

  2. Muchas gracias por el dato, yo a igual que Cristian hace unos meses tuve que hacer una plantilla para formatear una fecha, y estas son cosas que no están documentadas en los helps, por lo cuál nos ayudas mucho al comentarlo aquí.

    Saludos cordiales

  3. Tienes razón sin embargo para los que quieren solo mostrar la hora deben colocar HtmlEncode=false y colocar DataFormatString={0:hh:mm:ss}. Saludos mi primer aporte en .net

  4. Gracias.. amigo por la información de las fechas… la verdad… me estaba volviendo loco. Este mismo problema ocurre cuando el campo es de tipo decimal, el numero sale con muchos ceros a la derecha…

    Te agradesco por la información.

  5. Hola amigos, otra alternativa con la cual pueden sortear facilmente este problema cuando trabajen con BD SQL Server es pasarle el dato ya formateado desde la query, ejemplo:
    SELECT CONVERT(CHAR(10), GETDATE(), 20) ‘FCHA/ACTUAL’
    la query anterior da como resultado: 2008-01-30
    otro ejemplo:
    Select Convert(Char(10), Getdate(), 9)
    da como resultado: Ene 30 200

    Como se pueden dar cuenta, en este par de querys se formatea la fecha según se requiera y el GridView ya no da tanta lata.

    Saludos.
    Saulinh-0

  6. Hola Inh-0:

    Gracias por la aportación.

    El problema de eso es que no se adaptaría a los ajustes regionales del usuario que accede a la página.

    Saludos

    JM.

  7. yo intente por los dos metodos pero igual no hace caso ese codigo q tu comentas en donde se lo debe colocar o como puedo soluciona este inconveniente

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *