Ajustar en varias líneas el texto de las celdas en un control DataGridView

Cuando utilizamos un control DataGridView como medio de presentación de los datos de una consulta, si el texto perteneciente a una columna resulta excesivamente largo, el control se ocupa de recortarlo de modo que en las celdas se visualice una parte del mismo, añadiendo al final unos puntos suspensivos, que indican al usuario la existencia de más texto, el cual puede visualizar si redimensiona el ancho de la columna.

Pero supongamos que es conveniente mantener la anchura de las columnas en nuestro control de cuadrícula, siendo necesario que el texto de la mencionada columna pueda ajustarse dentro de la celda, de tal manera que se reparta en varias filas.

Este comportamiento está disponible a través de una de las propiedades de estilo del DataGridView: WrapMode, a la que si asignamos el valor DataGridViewTriState.True, conseguiremos que el texto se divida en la celda sin necesidad de cambiar el ancho de la misma.

Como ejemplo de lo que estamos comentando, el siguiente código fuente carga un DataGridView con los registros de una tabla. Nótese que en la consulta SQL, se crea un campo calculado, concatenando tres de los existentes en la tabla, de forma que consigamos una columna con una buena cantidad de texto, que nos permita realizar las pruebas más adecuadamente.

private void Form1_Load(object sender, EventArgs e)
{
    SqlConnection cnConexion = new SqlConnection();
    cnConexion.ConnectionString = "Data Source=localhost;" +
        "Initial Catalog=Northwind;" +
        "Integrated Security=True";

    StringBuilder sbSQL = new StringBuilder();
    sbSQL.Append("SELECT CustomerID, ");
    sbSQL.Append("CompanyName + '-' + ContactName + '-' + Address AS DatosCliente, " );
    sbSQL.Append("City, Country FROM Customers");

    SqlCommand cmdComando = new SqlCommand(sbSQL.ToString(), cnConexion);
    SqlDataAdapter daAdaptador = new SqlDataAdapter(cmdComando);

    DataSet dsDatos = new DataSet();
    daAdaptador.Fill(dsDatos, "Customers");

    this.dataGridView1.DataSource = dsDatos;
    this.dataGridView1.DataMember = "Customers";

    this.dataGridView1.DefaultCellStyle.BackColor = Color.LightYellow;
    this.dataGridView1.DefaultCellStyle.ForeColor = Color.DarkViolet;

    // configurar el estilo predeterminado del DataGridView
    // para que divida el texto de las celdas en varias líneas
    this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
}

Sin embargo, el código anterior resuelve el problema sólo en parte, puesto que al ejecutar de nuevo la aplicación, no se muestra el texto de la celda al completo. Podemos observar que en efecto, ahora el texto se ha dividido en varias líneas, pero el usuario debe redimensionar la fila para poder ver el contenido al completo de la celda.

Para conseguir que el DataGridView redimensione automáticamente la altura de sus celdas, adaptándose al contenido de las mismas, es necesario ejecutar el método DataGridView.AutoResizeRows, pasándole como parámetro un valor de la enumeración DataGridViewAutoSizeRowsMode, para establecer el modo de ajuste automático.

Dado que esta operación necesitamos realizarla después de que el control haya terminado de cargar los registros del origen de datos, un lugar adecuado sería el evento Paint del control, como vemos a continuación.

private void dataGridView1_Paint(object sender, PaintEventArgs e)
{
    this.dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.DisplayedCells);
}

Al volver al ejecutar el formulario, las filas del DataGridView adaptarán ahora su altura para mostrar todo el contenido de las celdas sin necesidad de redimensionarlas manualmente.

No obstante, al observar el formulario en ejecución, habremos percibido un efecto de parpadeo, producido por el reajuste continuo que está realizando el control al ejecutar el evento Paint.

Una solución a este problema consistiría en ejecutar el método DataGridView.AutoResizeRows dentro del manipulador del evento Paint solamente una vez, tras la carga inicial de datos del control. Para ello, declararemos una variable con ámbito a nivel de la clase del formulario, que se comporte como un indicador de estado, cambiando su valor tras la primera ejecución de Paint, como vemos en el siguiente bloque de código.

public partial class Form1 : Form { // indicador para ajustar la altura de las celdas // al presentar inicialmente el DataGridView bool blnAjustarCeldas = true; //…. private void dataGridView1_Paint(object sender, PaintEventArgs e) { if (blnAjustarCeldas) { blnAjustarCeldas= false;

this.dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.DisplayedCells); } } }

Pero todavía no hemos terminado, falta salvar un escollo más, ya que con el ajuste anterior evitamos el efecto de parpadeo, pero al comenzar a desplazarnos por el resto de registros del DataGridView, estas volverán a mostrarse sin el ajuste en su altura. El remedio ahora pasaría por codificar el manipulador del evento Scroll del control, ejecutando también aquí el método DataGridView.AutoResizeRows.

private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
{
    this.dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.DisplayedCells);
}

Tras este último aderezo en nuestro código, ahora sí que funcionará según el objetivo marcado al principio del artículo.

El código fuente puede descargarse en los siguientes enlaces: C# y VB.

Un saludo.

 

Published 2/2/2008 19:20 por Luis Miguel Blanco
Archivado en: ,
Comparte este post:

Comentarios

Thursday, March 12, 2009 12:06 PM por Rosa

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Muy útil y perfectamente explicado.

Gracias!

Wednesday, April 1, 2009 12:02 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Rosa

Muchas gracias por leer el artículo y por tu opinión.

Un saludo,

Luismi

Monday, May 25, 2009 10:19 PM por Juan Carlos Medina

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Muy bueno tu artículo, m fue de gran ayuda varias de tus lineas utilizadas.

Thursday, June 18, 2009 9:48 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Juan Carlos

Gracias por leer el post y celebro que te fuera de utilidad.

Un saludo,

Luismi

Thursday, June 18, 2009 9:52 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Fiorella

Si necesitas realizar algún tipo de tratamiento de datos en una aplicación desarrollada para .NET Framework, yo te recomendaría que utilizaras ADO.NET, ya que es una tecnología desarrollada para un funcionamiento más óptimo de las operaciones de gestión de datos en este entorno.

Revisa cualquiera el enlace que tienes en este artículo con el código fuente en VB, para que puedas ver cómo se establece la conexión con la base de datos y se realiza una consulta hacia la misma, también te paso un par de enlaces adicionales sobre ADO.NET, que espero te sean de utilidad.

support.microsoft.com

www.canalvisualbasic.net/.../manual_ado.net.asp

Un saludo,

Luismi

Thursday, August 6, 2009 11:45 PM por Inductivo

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Muy buen articulo, me ha servido mucho (Y)

Felicidades!!

Saturday, August 22, 2009 12:53 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Inductivo

Gracias por tu interés en el artículo, me alegra que te haya resultado útil.

Un saludo,

Luismi

Wednesday, December 9, 2009 5:57 PM por Javier Sanjuan Hernandez

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Exelente explicacion aunque estaba en visual c

lo hice para visual basic y me funciono correctamente mil gracias

Friday, December 18, 2009 6:07 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Javier

Gracias por tu interés en el post. Celebro que te funcionara adaptando el código a vb, aunque al final del texto del post tienes dos enlaces con el proyecto del ejemplo, uno para C# y otro para VB.

Un saludo,

Luismi

Friday, February 5, 2010 1:21 AM por Jas

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

SUper justo lo q estaba buscando gracias :)

Friday, February 12, 2010 7:29 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Jas

Gracias por tu opinión, celebro que te sirviera de ayuda.

Un saludo,

Luismi

Monday, February 22, 2010 3:27 AM por Alfonso Vásquez

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Gracias por el post! En serio me salvaste. Tenía un problema donde tenía un DataGridView con AutoSizeRowsMode en DisplayedCells, y cuando de repente cambiaba el DataSource del BindingSource que manejaba el grid, ya el resize no servía. No se porque, pero creo que como las celdas todavía no estaban desplegadas, no reajustaba el tamaño. Pero con tu método me funcionó perfectamente!

Wednesday, February 24, 2010 6:29 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Alfonso

Celebro que mi ejemplo fuera de ayuda 8-)

Un saludo.

Luismi

Friday, June 25, 2010 8:34 PM por Alejandro

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola, excelente tu aporte alfonso, tenia justo ese problema y nosabia como hacerle me fue de gran ayuda....

Wednesday, May 18, 2011 2:16 AM por Guillermo Rosales Goethe

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

JAJAJA 1 hora buscando como mostrar el texto en una fila, la propiedad wrap esta muy escondida en "PROPIEDADES" gracias por el ejemplo

Wednesday, May 18, 2011 5:46 PM por Anthony

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

no puedo reajustar las filas...descargue el ejemplo y sigue saliendo en una fila, tengo que redimensionarlo manualmente, ya que no sale de forma automática..:S...alguien puede ayudarme??

Saturday, May 21, 2011 1:39 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Guillermo

Gracias por tu interés en el post, y celebro que te haya resultado de ayuda.

Un saludo,

Luismi

Saturday, May 21, 2011 1:40 PM por Luis Miguel Blanco

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Hola Anthony

He revisado el ejemplo y me funciona correctamente, por favor, revisa por si hay alguna propiedad a la que no has asignado el valor correcto.

Un saludo,

Luismi

Friday, August 19, 2011 12:52 PM por Luis

# re: Ajustar en varias líneas el texto de las celdas en un control DataGridView

Gracias por esta ayuda me ha servido de mucho