Optimizando la comprobación de la columna a formatear en el DataGridView

En una serie de artículos publicados anteriormente sobre el control DataGridView, mostrábamos diversas técnicas para aplicar formato a las celdas de la cuadrícula de datos, empleando el evento CellFormatting para realizar tal operación.


El modo utilizado en esos ejemplos para saber si la columna a formatear era la requerida, pasaba por tomar el parámetro DataGridViewCellFormattingEventArgs que recibe el evento, y usando el valor de su propiedad ColumnIndex, aplicarlo al índice de la colección Columns del DataGridView, para obtener la columna en curso; finalmente, la propiedad Name del objeto columna obtenido nos proporciona su nombre, como vemos a continuación.


private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (this.dataGridView1.Columns[e.ColumnIndex].Name == «FirstName»)
{
//….

En escenarios donde creamos dinámicamente las columnas del DataGridView basándonos en la simple asignación del origen de datos a su propiedad DataSource, esta técnica resuelve correctamente la detección de la columna a formatear, pero si hemos creado previamente las columnas del control desde el diseñador de formularios, existe una manera que resulta más directa a la hora de comprobar la columna de formato.


Vamos a suponer que en nuestro proyecto hemos creado un origen de datos que devuelve las filas de ciertas columnas pertenecientes a la tabla Orders, de la base de datos Northwind.



Dicho origen de datos lo asociamos desde el diseñador del formulario a un DataGridView, acción esta que automáticamente nos construye las columnas de este control de cuadrícula.



Las columnas recién creadas para el DataGridView son objetos derivados de la clase DataGridViewTextBoxColumn; esto lo podemos comprobar si editamos la colección Columns del control y observamos su propiedad ColumnType.



Pero el detalle más importante reside en que estos objetos columna, aunque pertenecientes a la colección DataGridView.Columns, también se encuentran accesibles de forma independiente, de igual manera que el resto de controles que podamos haber añadido a nuestro formulario.


Como consecuencia de esta situación, al escribir el código del manipulador del evento CellFormatting, podemos comparar la propiedad DataGridViewCellFormattingEventArgs.ColumnIndex contra la propiedad Index de la columna sobre la que necesitemos aplicar el formato, del modo que vemos en el siguiente bloque de código.


private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == this.orderDateDataGridViewTextBoxColumn.Index)
{
e.CellStyle.Format = «dddd, dd-MMM-yyyy»;
}
}

Lo que puede aportarnos una cierta mejora en el rendimiento de este evento, ya que al trabajar contra orígenes de datos que contengan gran número de filas, deberá ejecutarse en un elevado número de ocasiones. La siguiente imagen muestra el resultado de la operación de formato del anterior código fuente.



Antes de terminar, quería agradecer a Javier, lector de uno de los anteriormente mencionados artículos sobre CellFormatting, sus sugerencias sobre la técnica de formato comentada en el presente post.


Un saludo.

2 Comentarios

  1. anonymous

    Este formate solo sirve cuando se carga el grid ?. existe alguna tecnica para cuando se este editando mostrar una mascara en la celda?

  2. lmblanco

    Hola JOGKSONG

    Es posible, en efecto, personalizar la edición de las celdas del DataGridView, sustituyendo el textbox que por defecto ofrece para editar el valor, por otro más adecuado a nuestras necesidades.

    Hace unos meses publiqué un artículo sobre este tema en el número 47 dotNetMania, bajo el título «Sustituyendo el editor de celdas del control DataGridView». En la siguiente dirección puedes acceder al sumario de este número, donde encontrarás un enlace con los ejemplos que allí expuse. Espero que te sirvan de ayuda.

    http://www.dotnetmania.com/Articulos/047/index.html

    Un saludo.
    Luismi

Deja un comentario

Tema creado por Anders Norén