sábado, 31 de mayo de 2008

Controles de datos

En la mayoría de aplicaciones destinadas al ámbito empresarial siempre se tiene que trabajar, de una manera u otra, con conjuntos más o menos grandes de datos. Para ayudar a los desarrolladores en estas situaciones, .NET ofrece una serie de controles de datos que permiten mostrar y manipular la información con la que se quiere trabajar. De estos controles el más conocido y el mas utilizado sin duda es el datagrid (o rejilla de datos). En la versión 2005 de Visual Studio este control pasó a llamarse DataGridView, y además venia acompañado por otros controles que pueden facilitar mucho la labor de mostrar datos por pantalla. En este post-ejemplo veremos los siguientes:
  • BindingSource: que permite entre, otras cosas, simplificar el enlace a los datos entre los controles de un formulario (por ejemplo el DataGrid, pero también cualquier otro control) y los propios datos, encargandose de la notificación de los cambios, filtros, etc...
  • BindingNavigator: que permite al usuario navegar e interactuar con los datos enlazados a un formulario proporcionando para ello una interfaz gráfica.

Lo que haremos será ver un sencillo ejemplo de cómo utilizar estos 3 controles combinados para mostrar y manipular un conjunto de datos.

Una vez añadidos los controles al formulario tenemos que indicar la relaciones entre ellos. En el evento Load del formulario escribimos lo siguiente:

private void FormMain_Load(object sender, EventArgs e) { myDataGridView.DataSource = myBindingSource; myBindingNavigator.BindingSource = myBindingSource; }


Con estas dos instrucciones estamos indicando que el BindingSource será tanto la fuente de datos del DataGrid como del BindingNavigator (el BindingNavigator "navegará" sobre los datos que haya en el BindingSource y el DataGridView mostrarà los datos que haya en el BindingSource).

Ahora solamente falta enlazar los datos propiamente dichos con el BindingSource. En principio el objeto BindingSource acepta como fuente de datos cualquier objeto que implemente alguna de las siguientes interfaces: IBindingList, IListSource o ITypedList.
En el ejemplo veremos que el conjunto de datos vendrá definido en un DataTable ya que una manera muy comun de obtener datos de una base de datos. Para hacerlo basta indicar lo siguiente:

// el método GetDataFromDB simula una llamada a una BBDD devolviendo un DataTable.
// El código se ejecutará al pulsar un botón creado a tal efecto.
private void btMostrar_Click(object sender, EventArgs e)
{
myBindingSource.DataSource = getDataFromDB();
}

En el momento de pulsar el botón los datos devueltos se añaden al BindingSource y por consiguiente son visibles desde el DataGrid. Además de mostrar los datos en el DataGrid, el objeto BindingSource permite por realizar acciones tales como filtrar y ordenar. Un ejemplo para realizar la ordenación seria el siguiente:

myBindingSource.Sort = "ID DESC";

La propiedad Sort de BindingSource espera una cadena en la que se le indica la columna del bindingSource por la que se quiere ordenar, y si se quiere hacer de manera ascendente o descendente. En nuestro ejemplo se ordena por la columna ID de manera descendente.

Por su parte a propiedad de Filtrado permite filtrar según los valores de alguno de los campos del conjunto de datos, por ejemplo:

myBindingSource.Filter = cbFiltro.Items[cbFiltro.SelectedIndex].ToString() + " LIKE '" + tbxFiltro.Text + "%'";

La propiedad Filter, espera una cadena con una sintaxis similar al lenguaje SQL, en la cual se le indica la columna por la que se quiere filtrar y el tipo de comparación que se desea. En el ejemplo se usa un combobox para indicar la columna y se hace una comparación LIKE, que indica que se buscaran todas aquellas coincidencias que empiecen igual que el texto buscado (ej: Nombre Like 'M%' devolverá todos los nombres que empiecen por M)

La interacción con BindingSource permitiria movernos por los diferentes ítems de los datos y realizar acciones cómo eliminar y/o insertar nuevos elementos.

Por ejemplo pulsando el botón de borrar se eliminaría el elemento seleccionado (del DataGrid, no del origen de datos!!) y saltaría el evento bindingNavigatorDeleteItem_Click. Una de las pegas de este evento (y del control bindingsource también) es que no proporciona información sobre cual es el item que se acaba de borrar. Si se quiere tener esta informacion se debería utilizar algún evento de borrado del propio DataGrid.

Los controles de datos, además de lo que hemos mostrado en esta escueta introducción, permiten una alta personalización y flexibilidad, haciendo la tarea de trabajar con datos en nuestras aplicaciones mucho más sencilla y potente.

Los que quieran profundizar más en ellos pueden visitar los siguientes enlaces:

BindingSource
BindingNavigator

Código fuente del ejemplo














2 comentarios:

Jose dijo...

Hola buen día,

Quise descargar tu ejemplo, pero el enlace de RapidShared ya esta vencido,

Saludos

jose.depaz@gmail.com

JASOSA dijo...

Buenas,

si te interesa puedo intentar volver a subirte el ejemplo entre hoy y mañana.

De todas maneras gracias por leernos!