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.

💪🏻 驴Este post te ha ayudado?, 驴has aprendido algo nuevo?
Pues NO te pido que me invites a un caf茅... Te pido algo m谩s f谩cil y mucho mejor