Formatear cadenas como columna de fecha en el control DataGridView

A raíz de un artículo que publiqué sobre diversos aspectos de la presentación de datos en el control DataGridView, hace unos días recibí un comentario de un lector, en el que me exponía el problema que tenía para visualizar una tabla de una base de datos mediante este control, ya que en dicha tabla, uno de sus campos contenía valores de fecha, pero almacenados como cadenas, en un estilo yyyymmddhhmm; por ejemplo: 200804251200.

Supongamos que la tabla a la que se hace mención, tiene una estructura y contenido similares a los que vemos en la siguiente imagen.

Una de las posibles formas de abordar el problema que se acaba de plantear consistiría en crear, en primer lugar, una consulta SQL contra la tabla, que convirtiera los valores del campo de tipo cadena a fecha.

SELECT ProductID, Name, Color, ListPrice, 
CONVERT(datetime, SUBSTRING(SellDate,1,8), 101) AS SellDate
FROM Product

Esta consulta la utilizaremos dentro del código de nuestra aplicación para obtener un objeto DataTable que asignaremos al control DataGridView.

using System.Data.SqlClient;
//....
private void Form1_Load(object sender, EventArgs e)
{
    // crear la sentencia sql para obtener las filas;
    // convertir el campo SellDate de tipo cadena a un tipo fecha
    StringBuilder sbSQL = new StringBuilder();
    sbSQL.Append("SELECT ProductID, Name, Color, ListPrice, ");
    sbSQL.Append("CONVERT(datetime, SUBSTRING(SellDate,1,8), 101) AS SellDate ");
    sbSQL.Append("FROM Product");

    // conectar con la base de datos,
    // ejecutar la consulta y asignar el resultado al DataGridView
    SqlConnection cnConexion = new SqlConnection();
    cnConexion.ConnectionString = "Data Source=localhost;" +
        "Initial Catalog=Pruebas;" +
        "Integrated Security=True";

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

    cnConexion.Open();
    daAdaptador.Fill(dsDatos, "Product");
    cnConexion.Close();

    this.dataGridView1.DataSource = dsDatos.Tables[0];
}

Finalmente, en el evento CellFormatting del DataGridView, detectaremos el momento en el que a la columna SellDate le toca ser formateada, aplicándole el formato de fecha que necesitemos.

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // cuando la celda corresponda al campo SellDate
    // formatear el valor de fecha
    if (this.dataGridView1.Columns[e.ColumnIndex].Name == "SellDate")
    {
        e.CellStyle.Format = "dd-MM-yyyy";
    }
}

Como resultado obtendremos en el DataGridView la columna con el modo de presentación deseado.

Espero que este pequeño truco le resulte de utilidad a quien pueda encontrarse en esta situación.

Un saludo.

 

2 Comentarios

  1. ifernandez

    Cómo te lo curras master, si señor, gran articulo

  2. lmblanco

    Hola Isaac

    Muchas gracias campeón, me alegra que te gustara el truco 😎

    Un saludote,
    Luismi

Leave a Reply

Tema creado por Anders Norén