.NET – Manipular un DataGridView usando BindingSource

El control DataGridView para aplicaciones de escritorio es una de las mayores ventajas de .NET, a mi parecer. Su equivalente en web, el GridView ofrece un sinfin de características y extensiones. El control para WinForms no es la excepción, pero a veces tenemos la idea incorrecta de cómo funciona.

He visto mucha gente (y también fui uno de ellos) preguntando cómo manipular la información en un DataGridView. Por ejemplo, hacer que el valor de un campo se modifique al cambiar el dato de otro campo. También las dudas de cómo cargar el control al hacer ciertos cambios en el origen de datos. Y algunas preguntas más que podríamos encontrar.

Bueno, primero que nada, hay que conocer el sucio y oscuro secreto del DataGridView: es únicamente para mostrar información. Un DataGridView toma el origen de datos, se alimenta con sus datos y ya, es todo. Dicho de otro modo, el DataGridView es solamente la interfaz de lo que contiene el origen de su información :O

Pero entonces, ¿¡para qué %$(#ados me sirve un DataGridView!? Bueno, ahí mismo está la respuesta. El DataGridView es la presentación de los datos, y lo que el origen de datos tenga, sea lo que sea, es lo que se va a mostrar en nuestro Grid. Por lo tanto, es el origen de datos mismo el que tenemos que manipular. Aquí es donde entra el otro control mencionado en el título: el BindingSource.

Un BindingSource es un objeto que guarda una colección de objetos de cualquier tipo. Incluye la misma propiedad DataSource de controles como el GridView o el ComboBox, con la diferencia que el BindingSource no es un control visible, sino que se utiliza justamente como origen de datos de controles como los mencionados.

En el proyecto adjunto al final de este artículo se muestra cómo cargar un BindingSource con una lista de objetos de una clase. Esta lista puede ser llenada desde una base de datos, desde un archivo, desde el mismo código o, como en el ejemplo, poner una lista vacía que se irá alimentando por medio de la aplicación. Este BindingSource se utiliza para llenar un DataGridView, desde el cual se registran objetos de la clase utilizada y se insertan automáticamente en el BindingSource. El Grid muestra los datos de la misma forma que si tuviera el origen de datos directamente, utilizando las propiedades de la clase como los campos a mostrar.

Otra gran ventaja del BindingSource es que desde su propiedad Current obtenemos el objeto “actual” del control, que en este caso sería la fila actualmente seleccionada en el Grid. Cuando cambiamos esa selección, la propiedad Current en el BindingSource cambia automáticamente al objeto seleccionado. La propiedad Current devuelve un valor object, el cual es equivalente al objeto de la clase indicada en el origen, sea una clase personalizada, una variable, un DataRow, etc.

Habiendo explicado todo esto, les dejo el enlace de descarga al proyecto, donde se puede ver una manera sencilla de utilizarlo.

Actualización (19/06/2017)

Subí el proyecto a GitHub. Está hecho en Visual Studio 2015 con .NET Framework 4.0:

Código fuente (VS2015/.NET4.0)

 

Anuncios

Autor: Israel Muñoz

Soy desarrollador de software, principalmente dedicado a desarrollo de aplicaciones web. Especializado en .NET full-stack, además de tecnologías front-end HTML, CSS y JavaScript. A ratos, profesor de materias de informática. Me gusta mucho todo lo que tiene que ver con las tecnologías nuevas para desarrollo web, y el diseño de sitios y aplicaciones.

6 comentarios en “.NET – Manipular un DataGridView usando BindingSource”

  1. Muy interesante el control BindingSource, ahora sé que el DataGridView solamente se utilizar para mostrar información. Sin embargo podemos personalizarlo creando clases nuevas que extiendan de DataGridViewColumn. Saludos.

  2. Hola, me ha sido de gran ayuda tu código, no sabia que los databindings se podian enlazar con listas de clases, lo que me he dado cuenta es que una vez el databinding está enlazado si insertamos algo en la lista en tiempo de ejecución el datagridview no lo muestra correctamente y da error si luego intento insertarlo por el datagrid.
    Esto es lo que he echo

    static List lista = new List();
    public Form1()
    {
    InitializeComponent();

    lista = new List();
    Clases.Productos p = new Productos();
    p.nombre = “hola”;
    lista.Add(p);
    bindingSource1.DataSource = lista;
    }

    private void button2_Click(object sender, EventArgs e)
    {
    Clases.Productos p = new Productos();
    p.nombre = “hola”;
    lista.Add(p);
    dataGridView1.Update();
    dataGridView1.Refresh();
    }

    ni con el update ni el refresh lo muestra
    ¿alguien sabe porque no funciona y como se puede arreglar?

    Un saludo

  3. Muy útil la información, cuesta creer que el GridView es solo una cascara!
    Tengo una duda, para colocar columnas calculadas (del estilo costo*cantidad), como se hace con bindingsource? Porque he visto otros ejemplos que lo hacen con DataSet pero igual no me queda del todo claro!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s