[C#] Cargar Datagridview a partir de un datatable o una lista genérica

Introducción

En este artículo les voy a explicar como cargar un datagridview utilizando una tabla de datos en memoria (DataTable) y una lista genérica (List(Of T)).

A modo de ejemplo voy a utilizar la tabla Production.Product de la base de datos AdventureWorks2012. Si no tenes la base de datos en tu sistema, podes ver este link. De dicha tabla, voy a usar los campos Name, ProductNumber, Color y Class.

Lista Genérica

Creamos una nueva clase Producto en la cual vamos a definir las propiedades que van a representar a los campos de la tabla Production.Product.

El segundo paso es definir las columnas de nuestro datagridview en tiempo de diseño.
  • Para ello, hacemos clic sobre la parte superior derecha (La flecha) del control datagridview y hacemos clic en Agregar columna



  • Se nos abrirá una pantalla en el cual debemos ingresar el nombre de la columna, el tipo y texto de la cabecera de dicha columna. Vamos agregar cuatro columnas que van a representar a los cuatro campos mencionados anteriormente de la tabla Production.Product. Los campos son: Name, ProductNumber, Color y Class.
  • Al agregar las cuatro columnas, debemos asignar la propiedad DataPropertyName de cada columna. Para eso volvemos hacer clic sobre la parte superior derecha (La flecha) del control datagridview, pero esta ves hacemos clic en Editar Columnas.
  • Seleccionamos cada una de las columnas y cambiamos la propiedad DatPropertyName al nombre de la propiedad de nuestra clase Producto.
  • Al terminar con la edición, llego el momento de crear el método que devolverá una lista de productos que luego lo vamos a utilizar para establecer dicho origen al datagridview.

        private List<productoen> CargarProductos()
        { 
            List<productoen> ListaProductos = new List<productoen>();

            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                cnn.Open();
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataReader lector = cmd.ExecuteReader();

                while (lector.Read())
                {
                    ProductoEN UnProducto = new ProductoEN();
                    UnProducto.Nombre = lector[0].ToString();
                    UnProducto.NumeroProd = lector[1].ToString();
                    UnProducto.Color = lector[2].ToString();
                    UnProducto.Clase = lector[3].ToString();

                    ListaProductos.Add(UnProducto);
                }
            }

            return ListaProductos;
        }

En el evento Load del formulario debemos asignar la propiedad AutoGenerateColumns a false ya que la hemos definido en tiempo de diseño. Dicha propiedad esta establecida en true, es por eso que debemos cambiarla, si no lo hacemos se van a duplicar las columnas. Esto implica que vamos a tener 8 columnas, 4 que las generamos nosotros y las otras 4 que las genero el propio control.
Además vamos asignar el método CargarProductos() a la propiedad DataSource del datagridview.

        private void Form1_Load(object sender, EventArgs e)
        {
            DatosDG.AutoGenerateColumns = false;
            DatosDG.DataSource = CargarProductos();

            DatosDtDG.DataSource = CargarProductosDT();

            //Tamaño de cada columna
            foreach (DataGridViewColumn columna in DatosDtDG.Columns)
            {
                columna.Width = 118;
            }
        }



DataTable

La carga del datagridview es similar a la lista genérica pero vamos a tomar el otro camino, el de no generar las columnas en tiempo de diseño.

Creamos el método que va a devolver un datatable que luego vamos a utilizar para establecer dicho origen al datagridview.

        private DataTable CargarProductosDT()
        {
            DataTable dt = new DataTable();
            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            return dt;
        }

En el evento Load del formulario definimos el DataSource del Datagridview

            DatosDtDG.DataSource = CargarProductosDT();


La diferencia que podemos notar en los dos datagridview es el nombre de las columnas. Por un lado, el de la lista genérica se hicieron de manera manual, en cambio el del datatable automáticamente el datagridview toma como nombre de las columnas el nombre de las columnas de la tabla de la base de datos. Esto se puede cambiar de la siguiente manera:

DatosDtDG.Columns[0].HeaderText = "Nombre de Columna";

Fin


Código Fuente

Dropbox  

Descargar

[C#] Cargar Datagridview a partir de un datatable o una lista genérica

Introducción

En este artículo les voy a explicar como cargar un datagridview utilizando una tabla de datos en memoria (DataTable) y una lista genérica (List(Of T)).

A modo de ejemplo voy a utilizar la tabla Production.Product de la base de datos AdventureWorks2012. Si no tenes la base de datos en tu sistema, podes ver este link. De dicha tabla, voy a usar los campos Name, ProductNumber, Color y Class.

Lista Genérica

Creamos una nueva clase Producto en la cual vamos a definir las propiedades que van a representar a los campos de la tabla Production.Product.

El segundo paso es definir las columnas de nuestro datagridview en tiempo de diseño.
  • Para ello, hacemos clic sobre la parte superior derecha (La flecha) del control datagridview y hacemos clic en Agregar columna



  • Se nos abrirá una pantalla en el cual debemos ingresar el nombre de la columna, el tipo y texto de la cabecera de dicha columna. Vamos agregar cuatro columnas que van a representar a los cuatro campos mencionados anteriormente de la tabla Production.Product. Los campos son: Name, ProductNumber, Color y Class.
  • Al agregar las cuatro columnas, debemos asignar la propiedad DataPropertyName de cada columna. Para eso volvemos hacer clic sobre la parte superior derecha (La flecha) del control datagridview, pero esta ves hacemos clic en Editar Columnas.
  • Seleccionamos cada una de las columnas y cambiamos la propiedad DatPropertyName al nombre de la propiedad de nuestra clase Producto.
  • Al terminar con la edición, llego el momento de crear el método que devolverá una lista de productos que luego lo vamos a utilizar para establecer dicho origen al datagridview.

        private List<productoen> CargarProductos()
        { 
            List<productoen> ListaProductos = new List<productoen>();

            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                cnn.Open();
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataReader lector = cmd.ExecuteReader();

                while (lector.Read())
                {
                    ProductoEN UnProducto = new ProductoEN();
                    UnProducto.Nombre = lector[0].ToString();
                    UnProducto.NumeroProd = lector[1].ToString();
                    UnProducto.Color = lector[2].ToString();
                    UnProducto.Clase = lector[3].ToString();

                    ListaProductos.Add(UnProducto);
                }
            }

            return ListaProductos;
        }

En el evento Load del formulario debemos asignar la propiedad AutoGenerateColumns a false ya que la hemos definido en tiempo de diseño. Dicha propiedad esta establecida en true, es por eso que debemos cambiarla, si no lo hacemos se van a duplicar las columnas. Esto implica que vamos a tener 8 columnas, 4 que las generamos nosotros y las otras 4 que las genero el propio control.
Además vamos asignar el método CargarProductos() a la propiedad DataSource del datagridview.

        private void Form1_Load(object sender, EventArgs e)
        {
            DatosDG.AutoGenerateColumns = false;
            DatosDG.DataSource = CargarProductos();

            DatosDtDG.DataSource = CargarProductosDT();

            //Tamaño de cada columna
            foreach (DataGridViewColumn columna in DatosDtDG.Columns)
            {
                columna.Width = 118;
            }
        }



DataTable

La carga del datagridview es similar a la lista genérica pero vamos a tomar el otro camino, el de no generar las columnas en tiempo de diseño.

Creamos el método que va a devolver un datatable que luego vamos a utilizar para establecer dicho origen al datagridview.

        private DataTable CargarProductosDT()
        {
            DataTable dt = new DataTable();
            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            return dt;
        }

En el evento Load del formulario definimos el DataSource del Datagridview

            DatosDtDG.DataSource = CargarProductosDT();


La diferencia que podemos notar en los dos datagridview es el nombre de las columnas. Por un lado, el de la lista genérica se hicieron de manera manual, en cambio el del datatable automáticamente el datagridview toma como nombre de las columnas el nombre de las columnas de la tabla de la base de datos. Esto se puede cambiar de la siguiente manera:

DatosDtDG.Columns[0].HeaderText = "Nombre de Columna";

Fin


Código Fuente

Dropbox  

Descargar

[C#] Cargar Datagridview a partir de un datatable o una lista genérica

Introducción

En este artículo les voy a explicar como cargar un datagridview utilizando una tabla de datos en memoria (DataTable) y una lista genérica (List(Of T)).

A modo de ejemplo voy a utilizar la tabla Production.Product de la base de datos AdventureWorks2012. Si no tenes la base de datos en tu sistema, podes ver este link. De dicha tabla, voy a usar los campos Name, ProductNumber, Color y Class.

Lista Genérica

Creamos una nueva clase Producto en la cual vamos a definir las propiedades que van a representar a los campos de la tabla Production.Product.

El segundo paso es definir las columnas de nuestro datagridview en tiempo de diseño.
  • Para ello, hacemos clic sobre la parte superior derecha (La flecha) del control datagridview y hacemos clic en Agregar columna



  • Se nos abrirá una pantalla en el cual debemos ingresar el nombre de la columna, el tipo y texto de la cabecera de dicha columna. Vamos agregar cuatro columnas que van a representar a los cuatro campos mencionados anteriormente de la tabla Production.Product. Los campos son: Name, ProductNumber, Color y Class.
  • Al agregar las cuatro columnas, debemos asignar la propiedad DataPropertyName de cada columna. Para eso volvemos hacer clic sobre la parte superior derecha (La flecha) del control datagridview, pero esta ves hacemos clic en Editar Columnas.
  • Seleccionamos cada una de las columnas y cambiamos la propiedad DatPropertyName al nombre de la propiedad de nuestra clase Producto.
  • Al terminar con la edición, llego el momento de crear el método que devolverá una lista de productos que luego lo vamos a utilizar para establecer dicho origen al datagridview.

        private List<productoen> CargarProductos()
        { 
            List<productoen> ListaProductos = new List<productoen>();

            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                cnn.Open();
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataReader lector = cmd.ExecuteReader();

                while (lector.Read())
                {
                    ProductoEN UnProducto = new ProductoEN();
                    UnProducto.Nombre = lector[0].ToString();
                    UnProducto.NumeroProd = lector[1].ToString();
                    UnProducto.Color = lector[2].ToString();
                    UnProducto.Clase = lector[3].ToString();

                    ListaProductos.Add(UnProducto);
                }
            }

            return ListaProductos;
        }

En el evento Load del formulario debemos asignar la propiedad AutoGenerateColumns a false ya que la hemos definido en tiempo de diseño. Dicha propiedad esta establecida en true, es por eso que debemos cambiarla, si no lo hacemos se van a duplicar las columnas. Esto implica que vamos a tener 8 columnas, 4 que las generamos nosotros y las otras 4 que las genero el propio control.
Además vamos asignar el método CargarProductos() a la propiedad DataSource del datagridview.

        private void Form1_Load(object sender, EventArgs e)
        {
            DatosDG.AutoGenerateColumns = false;
            DatosDG.DataSource = CargarProductos();

            DatosDtDG.DataSource = CargarProductosDT();

            //Tamaño de cada columna
            foreach (DataGridViewColumn columna in DatosDtDG.Columns)
            {
                columna.Width = 118;
            }
        }



DataTable

La carga del datagridview es similar a la lista genérica pero vamos a tomar el otro camino, el de no generar las columnas en tiempo de diseño.

Creamos el método que va a devolver un datatable que luego vamos a utilizar para establecer dicho origen al datagridview.

        private DataTable CargarProductosDT()
        {
            DataTable dt = new DataTable();
            using (SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"))
            {
                string ConsultaProductos = "SELECT Name,ProductNumber,Color,Class FROM Production.Product";
                SqlCommand cmd = new SqlCommand(ConsultaProductos, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            return dt;
        }

En el evento Load del formulario definimos el DataSource del Datagridview

            DatosDtDG.DataSource = CargarProductosDT();


La diferencia que podemos notar en los dos datagridview es el nombre de las columnas. Por un lado, el de la lista genérica se hicieron de manera manual, en cambio el del datatable automáticamente el datagridview toma como nombre de las columnas el nombre de las columnas de la tabla de la base de datos. Esto se puede cambiar de la siguiente manera:

DatosDtDG.Columns[0].HeaderText = "Nombre de Columna";

Fin


Código Fuente

Dropbox  

Descargar

7 comentarios :

  1. disculpa, como hago en una lista generica para mostar los datos de 2 tablas que se conectan por un id, y poder mostar los datos de ambas en el gridview?

    ResponderBorrar
  2. Disculpa, pero revisando el código no encuentro donde declaras y de que tipo es la variable UnProducto

    ResponderBorrar
  3. Rodrygo, usa inner para pegar las tablas y extraes un solo resultado.

    ResponderBorrar
  4. Buen aporte amigo me funciono bien!!

    ResponderBorrar
  5. como hago para poder ordenar los datos cuando uso una lista generica? cuando uso un datatable el ordenamiento se activa, pero con la lista generica no

    ResponderBorrar
  6. Oye como Puedo meter datos a un DataGridView por medio de texbox pero que no se me aguarde en una base de datos. Lo estoy haciendo en asp.net Gracias

    ResponderBorrar
  7. Por fin! Entre tanta cosa suelta en Internet, por fin un ejemplo fácil, dinámico y que no complique la vida. Muchas gracias viejo, te puse entre mis favoritos!

    Martín Lezama (martin.e.lezama@gmail.com)

    ResponderBorrar