dando formato a las columnas en un GridView (fechas, moneda, etc)

Holas!

Aunque ya José Manual Alarcón, habló de esto en un post, quiero dar mi aporte y comentarios sobre esto.

No sólo es con las fechas, es con cualquier formato que quieras aplicar a una columna. Como sabemos para aplicar formato a un columna se hace lo siguiente:

   <columns>
      <asp:BoundField DataField=“CreationDate”
                  DataFormatString=“{0:M-dd-yyyy}” HeaderText=“CreationDate” />
   </columns>

Se usa la propiedad DataFormatString para aplicar un formato, pero porque no se aplica el formato?, revisando DataFormatString en MSDN, encontramos el porqué, y lo que pasa es que cuando la propiedad HtmlEncode esta en true el valor de campo es codificado, es decir, el valor HTML de codifica a string. Y esto es así imaginen que tenemos nuestra etiqueta “<p>”, es un HTML, pero si usamos el método Server.HTMLEncode, lo que estamos haciendo es codificar el HTML a un string, y el valor devuelto sería “&lt;p&gt;”.

Eso mismo pasa cuando el la propiedad HtmlEncode de BoundField, esta en True, el valor del campo se convierte a string antes de que se aplique el formato. Y es por eso que es necesario colocar HtmlEncode=False, para evitar la codificación y poder aplicar el formato :D.

Espero haberme dejado entender… y si no.. sólo entiendan que con HtmlEncode=False, funciona el formato de DataFormatString.

Ahora ahondemos un poco más en DataFormatString, las siguientes letras son para formatos numéricos:

C -> Muestra los valores numéricos en formato de moneda.

D -> Muestra los valores numéricos en formato decimal.

E -> Muestra los valores numéricos en formato científico (exponencial).

F -> Muestra los valores numéricos en formato fijo.

G -> Muestra los valores numéricos en formato general.

N -> Muestra los valores numéricos en formato numérico.

X -> Muestra los valores numéricos en formato hexadecimal.

Así por ejemplo si queremos mostrar un promedio de notas con dos decimales, podemos poner lo siguiente:

   DataFormatString=”{0:F2}”

Con el cual tendríamos un resultado como este:

Ahora que si queremos usar dar formato una fecha tiene que ser de la siguiente forma:

   DataFormatString=“{0:M-dd-yyyy}”

Para ver los diversos formatos disponibles podemos visitar el siguiente link.

Nota: En el caso de la fecha y la moneda, están también estarán determinadas por la configuración regional de nuestro sistema.

Algunos otros links útiles:

Saludos,

Post cruzado

29 comentarios en “dando formato a las columnas en un GridView (fechas, moneda, etc)”

  1. Hola Sergio,

    Que prácticas son estas explicaciones ya que dar formato a columnas es una problemática diaria para cualquier desarrollador profesional. Si me dieran un euro por cada una que he formateado…

    Lo que no entiendo es el porque del comportamiento por defecto del GridView con la propiedad HTMLEncode en true.

    En la documentación pone que:”La codificación de los valores de campo en HTML ayuda a evitar que se muestren los ataques realizados mediante secuencias de comandos entre sitios y contenidos malintencionados. Esta propiedad debe estar habilitada siempre que sea posible.”

    Las preguntas que se vienen a la cabeza son las mismas que se le pasarían a cualquiera.¿Estamos haciendo menos seguras nuestras aplicaciones Web? ¿Si es cierto, a que tipos de ataques estamos expuestos?

    Saludos.

  2. Tengo una pregunta a ver si me la pueden resolver, es algo tonta pero no la se debido aque llevo unas semanas usando .net la pregunta es:

    ¿Con que propiedad del gridview puedo saber si arrojo resultados su respectivo sqldatasource?

    Ojala puedan ayudarme mi correo es pakorn_ags@hotmail.com

  3. hola me ha servido demasiado todo esto de dar formato a los datos en mi datagrid.
    la pregunta es porque no funciona mi condicion

    protected sub migrid_rowdatabound(….
    if e.row.cells(1).text=”1″ then
    e.row.cells(1).text=”SI”
    else
    e.row.cells(1).text=”NO”
    end if
    end sub

    cuando agrego la propiedad de AllowPaging=true
    debo de paginar mi grid ya que son demasiados registros pero quiero tambien modificar el valor de algunas columnas que traen otros datos

  4. Muy buena referencia, saludos

    Espero y les sirva esto, para cuando creen un
    dataTable, y no sea tomado de una Base de Datos, ponerle el tipo de columna(getType)…

    Para la columna PERCEPCIONES.
    htmlencode = false
    datafield = “PERCEPCIONES”
    DataFormatString=”{0:c2}” formato de moneda

    llenado de columnas…

    dt.Columns.Add(“CONCEPTO”, GetType(String))
    dt.Columns.Add(“PERCEPCIONES”, GetType(Double))
    dt.Columns.Add(“DEDUCCIONES”, GetType(Double))
    dt.Columns.Add(“ACUMULADOS”, GetType(Double))

    llenado de renglones…

    dt.Rows.Add(New Object() {“smensual”, 500.00, Nothing, Nothing})

    Me tope con este detalle espero sea de utilidad…

  5. Rafael, has intentado depurar para ver los valores?, en cuanto a la paginación que problema te da?.

    Armando gracias por las aclaraciones.

    Angel, de nada :).

    Saludos,

  6. Hola, tengo una pregunta por si me pueden ayudar.
    Me manda el mensaje: Error converting data type nvarchar to datetime.
    Esto cuando uso el formateo de una columna tipo fecha con:

    Responder

  7. EXCELENTE y muy práctica explicación! Antes de rendirse y usar un TemplateField para dar formato con un Label fué excelente descubrir por que no funciona el DataFormatString.

    Excelente!

    Saludos

  8. Bien Sergio!! tambien tenia este problema, y me tope con tu pagina, he visto que en VS2008 aparece una nueva propiedad: HTMLEncodeFormatString.

    Y para obtener los resultados deseados: HTMLEncode = False
    HTMLEncodeFormatString = true (aunque tambien podria estar en false).

    gracias.

  9. hola .. quisiera saber como puedo cambiar de orden la columna de tipo CommandField (seleccionar) para que aparezca al final de todas las columnas

  10. te cuento que tengo valores que me da en la base de 3,1452 pero quiero llenar en el gridview el valor con 3,14 como puedo hacer eso
    gracias

  11. Cordial saludo a todos, muy buen aporte, aunque aún no logro darle formato moneda a los textbox que se encuentran en una columna de un gridview. La idea es que pueda utilizar los textbox como un excel, los cuales modifico sin utilizar la opción update del gridview, sino directamente en el txtbox y pues quiero que después de guardar, se convierta lo que digité en fortmato número, :S, porfavor necesito ayuda, graciasss

  12. hola tengo una conexion a una bd sql server y en la grilla quiero un formato de tipo hora que en la bd esta tipo double como convierto este campo en la grilla para usarlo como formato {0:hh:mm:ss},
    ya que si lo uso normalmente me da error por que no es tipo fecha/hora

    ejemplo este es el campo

    y quiero agregarle el DataFormatString=”{0:hh:mm:ss]” pero da error por q es tipo double mas no date

Deja un comentario

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