Vous êtes sur la page 1sur 19

Iniciar se sin | HAZTE MIEMBR O !

| Ayuda

El aprendiz de brujo

El blog de Luis Miguel Blanco con hechizos, conjuros y sortilegios varios sobre la plataforma .NET

This Blog
Inicio C ontacto

Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)


Siguiendo con los aspectos relacionados con el formateo de valores utilizando este evento, en la presente entrega abordaremos la posibilidad de aplicar formatos basados en una condicin y sobre una columna a partir de los valores existentes en otras.

Tags .NET

AJAX
BISM

ASP.NET ASP.NET
AJAX
Business Intelligence Data Warehouse DAX Excel Integration
Services PowerPivot

Syndication
R SS ATO M R SS de com e ntarios

Search
Ir

Formato condicional Las operaciones tratadas hasta el momento podramos haberlas realizado prescindiendo del evento CellFormatting, ya que al aplicar el formato a la totalidad de la columna, habra bastado con seleccionar de la coleccin DataGridView.Columns aquella columna a formatear, y mediante la propiedad DefaultCellStyle -que contiene un tipo DataGridViewCellStyle-asignar a la propiedad Format la cadena de formato adecuada. Esto podemos hacerlo, por ejemplo, en el evento Load.

Community
Principal Blogs Gale ras de Me dios W ik is

Silverlight SQL Server SQL Server


2008 R2
SQ L Se rve r 2012

SSIS Tabular Mode l

Magos muy recomendables


Isaac Fe rnnde z Jorge Se rrano Marino Posadas R odrigo C orral

Trucos Varios VBA WCF RIA Services

Windows Forms

private void frmFormatoCondicional_Load(object sender, EventArgs e) WPF { Email Notifications this.dataGridView1.DataSource = ConstruirDatos.ObtenerTabla(); this.dataGridView1.Columns["BirthDate"].DefaultCellStyle.Format ail "MMMM ( Tu dire ccin de e -m =
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

R odrigo C orral O ctavio He rnnde z Salvador R am os Dataprix Plane t

Suscribirse

Recent Posts
O LAP Data cube s in SQ L Se rve r 2008 R 2 Analysis Se rvice s The im portance of re lationships in SQ L Se rve r 2012 tabular m ode ls Ge ne rate SQ L Se rve r te st data from Ex ce l. The transfe r to SQ L Se rve r (and 2) Ge ne rate SQ L Se rve r te st data from Ex ce l. O pe rations in Ex ce l (1) De m ographic data ge ne ration in SQ L Se rve r

Casas de sortilegios

Publicaciones
Libros Artculos

Tratados de magia

Es por ello que un uso ms conveniente del evento CellFormatting consistira en utilizarlo para formatear las celdas de una columna que cumplan una determinada condicin, como podemos ver en el siguiente bloque de cdigo, donde tras verificar que para la columna de tipo fecha, la celda a formatear contiene valor, si este corresponde al mes de febrero, se le aplica una cadena de formato para resaltar dicha celda.

Archives
July 2012 (1) June 2012 (1) May 2012 (2) April 2012 (3) March 2012 (2) January 2012 (1) O ctobe r 2011 (3)

LinkedIn

private void dataGridView1_CellFormatting(object sender, DataGridViewCellForm August 2011 (2) { July 2011 (1) if (this.dataGridView1.Columns[e.ColumnIndex].Name == "BirthDate") April 2011 (3) { March 2011 (1) try { Fe bruary 2011 (1) // comprobar si la celda tiene contenido vlido 2011 (3) January if (e.Value.GetType() != typeof(System.DBNull)) 2010 (3) O ctobe r { August 2010 (2)
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

// si la celda tiene valor y el mes es febrero July 2010 (2) // formatear el contenido June 2010 (3) if (((DateTime)e.Value).Month == 2) Fe bruary 2010 (1) { Se pte m be r 2009 (4) e.CellStyle.Format = "D"; e.CellStyle.BackColor = Color.Aqua; August 2009 (3) } June 2009 (2) } } catch (NullReferenceException oException) { } } }
A continuacin apreciamos el resultado en la siguiente imagen.
Nove m be r 2008 (1) O ctobe r 2008 (2) Se pte m be r 2008 (5) August 2008 (3) July 2008 (1) June 2008 (4) May 2008 (3) April 2008 (7) March 2008 (8) Fe bruary 2008 (8)

August 2010 (2)

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Fe bruary 2008 (8) January 2008 (8) De ce m be r 2007 (5)

Formato condicional aplicado a la totalidad de la columna En ciertas ocasiones puede resultar interesante aplicar una operacin de formato de modo global a todos los valores de una misma columna, consistente por ejemplo en modificar el texto original por otro ms extenso, como podemos ver en el siguiente cdigo, donde sustituimos los valores que inicialmente provienen de la columna Title de la tabla de datos.

private void dataGridView1_CellFormatting(object sender, DataGridViewCellForm { // cambiar el valor del campo Title
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

// cambiar el valor del campo Title if ((this.dataGridView1.Columns[e.ColumnIndex].Name == "Title") && (e.Val { string TituloCortesia = string.Empty; switch (e.Value.ToString()) { case "Sr.": case "Mr.": TituloCortesia = "Seor"; break; case "Mrs.": TituloCortesia = "Seora"; break; case "Ms.": case "Ms": TituloCortesia = "Seorita"; break; } e.Value = TituloCortesia; } }
Debido a la naturaleza del formato a realizar, este no puede acometerse asignando valores a los miembros de la propiedad DefaultCellStyle, perteneciente a la coleccin DataGridView.Columns -como veamos en un caso anterior. Dado que los cambios necesarios no siguen un patrn prefijado, resulta necesario resolver el problema desde el flujo del cdigo, dentro del evento CellFormatting.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Formato indirecto Como acabamos de comprobar, el formato condicional resulta de utilidad cuando deseamos aplicar un formato a las celdas de una columna en base a una expresin evaluada contra los valores de dicha columna. Sin embargo tambin podemos aplicar una variante de esta tcnica que consistira en realizar el formato sobre una celda, pero esta vez en funcin de la informacin proveniente de celdas pertenecientes a otras columnas. Pongamos como ejemplo, que en los datos con los que estamos operando, necesitamos destacar el nombre de los clientes cuyos ingresos anuales superen una determinada cantidad. Para ello, dentro del evento CellFormatting, cuando

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

cantidad. Para ello, dentro del evento CellFormatting, cuando corresponda aplicar formato a las columnas FirstName y LastName, comprobaremos el valor de la celda correspondiente a la columna YearlyIncome, y segn sea su valor, resaltaremos o no las celdas del nombre. Todo esto podemos comprobarlo en el siguiente cdigo.

private void dataGridView1_CellFormatting(object sender, DataGridViewCellForm { // si la celda a formatear corresponde al nombre del cliente... if ((this.dataGridView1.Columns[e.ColumnIndex].Name == "FirstName") || (this.dataGridView1.Columns[e.ColumnIndex].Name == "LastName")) { //...y sus ingresos superan una cierta cantidad, // formatear las celdas del nombre if ((decimal)this.dataGridView1.Rows[e.RowIndex].Cells["YearlyIncome" { e.CellStyle.BackColor = Color.PaleGreen; e.Value = e.Value.ToString().ToUpper(); } } }
La siguiente imagen muestra el resultado de este tipo de formato.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Formato indirecto utilizando una columna con imgenes Una variante de la tcnica ofrecida en el apartado anterior consistira en utilizar una columna de tipo imagen DataGridViewImageColumn- para mostrar una figura que represente el valor de una columna. Dentro de la tabla que estamos usando para nuestros ejemplos, un claro candidato lo representara la columna Gender, que nos informa acerca del gnero -masculino o femenino-correspondiente al cliente. A efectos visuales, dicha columna podemos sustituirla por una de imagen, que muestre una figura identificativa, pero

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

una de imagen, que muestre una figura identificativa, pero sin eliminar la columna Gender -que quedara oculta-, ya que necesitaremos recurrir a ella para consultar su valor y saber qu imagen situar en la celda en curso. En primer lugar agregaremos al proyecto sendos archivos de tipo imagen, que configuraremos en su propiedad Build Action para que se comporten como recursos incrustados Embedded Resource.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

A continuacin pasaremos al cdigo del formulario, donde en el evento Load ocultaremos la columna Gender y crearemos una nueva para contener las imgenes. Por otro lado, en el evento CellFormatting detectaremos cuando debe ser dibujada la celda de la nueva columna de imagen, y en dicho momento, comprobaremos el valor de la columna oculta Gender, asignando la imagen correcta. Todas estas operaciones las podemos ver en el siguiente cdigo fuente.

private void frmFormatoIndirectoImagen_Load(object sender, EventArgs e) { this.dataGridView1.DataSource = ConstruirDatos.ObtenerTabla(); // ocultar la columna que indica el gnero del cliente this.dataGridView1.Columns["Gender"].Visible = false; // crear una nueva columna de tipo imagen // para mostrar un icono indicativo del gnero del cliente // y agregarla a la coleccin de columnas del control DataGridViewImageColumn colGenero = new DataGridViewImageColumn(); colGenero.Name = "colGenero"; this.dataGridView1.Columns.Add(colGenero); }
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

private void dataGridView1_CellFormatting(object sender, DataGridViewCellForm { // cuando se vaya a pintar la celda de la columna de imagen if (this.dataGridView1.Columns[e.ColumnIndex].Name == "colGenero") { // establecer la altura de la fila para que se pueda visualizar corre this.dataGridView1.Rows[e.RowIndex].Height = 40;

// asignar la imagen adecuada switch ((string)this.dataGridView1.Rows[e.RowIndex].Cells["Gender"].V { case "M": e.Value = new Bitmap(this.GetType(), "SimboloMasculino.jpg"); break; case "F": e.Value = new Bitmap(this.GetType(), "SimboloFemenino.jpg"); break; } } }
En la siguiente imagen podemos observar el efecto de esta nueva columna en tiempo de ejecucin. Como dato curioso, el valor del campo Gender en la tabla de la base de datos no se corresponde correctamente en todas las ocasiones.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

La prxima entrega, que finaliza esta serie de artculos, abordar algunos aspectos adicionales de este tipo de operaciones. Como ya comentamos en la primera parte, los ejemplos estn disponibles en estos enlaces: C# y VB. Un saludo.

Publishe d 5/3/2008 20:46 por Luis Migue l Blanco Archivado e n: W indows Form s C om parte e ste post:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Comentarios
Thursday, March 06, 2008 5:46 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Enrique Muchas gracias, me alegra de que te hayan parecido interesantes 8-). Un saludo. Luismi

Thursday, March 27, 2008 10:54 AM por Alejo

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola creo que tienes un error en el primer ejemplo (de las fechas) if (e.Value == null || e.Value != System.DBNull.Value) deberia ser e.Value != null.. Saludos.. por cierto muy buen material

Thursday, March 27, 2008 7:16 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
open in browser PRO version pdfcrowd.com

Are you a developer? Try out the HTML to PDF API

Hola Alejo Muchas gracias por el aviso, en efecto, hay un error en la lnea que comentas, pero el uso de e.Value != null tampoco soluciona el problema cuando nos encontramos en un registro cuyo campo BirthDate es nulo. Acabo de revisar este cdigo y para que funcione correctamente hemos de utilizar la siguiente lnea: if (e.Value.GetType() != typeof(System.DBNull)) De esta forma s que podemos averiguar si el campo de fecha est a nulo, para proceder a darle o no formato. Gracias de nuevo por tu indicacin y por tu opinin sobre el post 8-). Un saludo. Luismi

Monday, March 31, 2008 5:33 PM por orlando

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Comunidad ... Tengo un problema con un columntype imagen, en la ultima fila adicionada me sale el icono de error de caragado de imagen , en todas las demas fila si me carga perfectamente la imagen pero en la ultima me da me sale ese error sin embargo puedo introducrile bien los datos

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Monday, March 31, 2008 7:34 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Orlando Debers detectar cundo se produce la situacin de final de fila en el DataGridView, para obligar a que muestre la imagen en la celda. Tambin puedes utilizar la siguiente direccin de los newsgroups de C# para formular tu consulta, donde seguramente recibirs ayuda adicional: www.microsoft.com/.../default.aspx Un saludo. Luismi

Tuesday, July 08, 2008 11:26 PM por Arturo Morlesin

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Felicidades por tus aportaciones, me sirvieron mucho. Monterrey Mxico

Thursday, July 10, 2008 12:10 AM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Arturo Muchas gracias por tu opinin y por leer el artculo; celebro

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Muchas gracias por tu opinin y por leer el artculo; celebro que te sirviera de ayuda 8-) Un saludo, Luismi

Monday, September 08, 2008 3:34 PM por LuisNet

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Felicitaciones por los ejemplos (me ayudo mucho)

Thursday, September 11, 2008 6:09 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola LuisNet Gracias por tu inters en el post, me alegra que te haya servido. Un saludo, Luismi

Friday, January 23, 2009 5:29 PM por Antonio

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Muy buena ayuda, me has sacado de un dilema, tenia muchos problemas para lograr mostrar una imagen diferente

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

muchos problemas para lograr mostrar una imagen diferente por cada registro de la tabla, anduve probando con el evento RowsAdded pero sin obtener los resultados que esperaba pero con esta guia estupenda lo he podido hacer en un dos por tres, muchas gracias.

Thursday, February 12, 2009 1:16 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Antonio Gracias por leer el post y celebro que te haya servido de ayuda. Un saludo. Luismi

Monday, February 23, 2009 9:18 PM por julio

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Muchas gracias por tu trabajo. Aun as tengo un problemilla. Tengo una celda tipo checkbox, enlazada a un campo en la base de datos. Los valores que puede tomar son 4 que sera S (true) y 5 que sera NO (false). Como las dos son distintos de 0 siempre me pone la celda como checked. Por ejemplo, el DataGridViewCell.Value = 5, pero el DataGridViewCell.FormattedValue es True, ya que el DataGridViewCell.FormattedValueType = Boolean

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Se te ocurre la forma de poder controlar que si el valor es 4 se ponga Checked y si es 5 Unchecked? muchas gracias

Saturday, February 28, 2009 7:43 AM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Julio En la consulta SQL que utilizas para posteriormente enlazar con el datagridview, puedes probar a crear el campo que empleas para esa columna checkbox como un campo calculado, que en funcin del valor original del campo, te convierta a 0 1. Algo parecido a lo siguiente: SELECT CAMPO1, CAMPO2, CASE WHEN CAMPO3 = 4 THEN 1 WHEN CAMPO3 = 5 THEN 0 END AS CAMPO3 FROM NOMBRE_TABLA De esta forma, cuando enlaces con la columna checkbox del datagridview, te debera visualizar las celdas marcadas y desmarcadas correctamente. Un saludo, Luismi

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Monday, September 13, 2010 5:39 PM por Manuel

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Muy buen aporte, hay muchos ejemplos buenos

Tuesday, September 14, 2010 5:56 PM por Luis Miguel Blanco

# re: Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (II)
Hola Manuel Gracias por tu inters en el artculo. Un saludo, Luismi

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Vous aimerez peut-être aussi