Cap’tulo 8

Vinculaci—n de controles a datos

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Introducci—n.

 

La vinculaci—n entre el origen de datos y los controles de un formulario puede ser de varios tipos dependiendo de  que pueda mostrar una sola columna de una fila o bien mœltiples filas o columnas. As’ podemos distinguir entre aquellos controles que s—lo precisan el contenido de una columna de una cierta fila, como los TextBox y similares: aquellos controles capaces de mostrar el valor que tiene una cierta columna en  mœltiples filas, como por ejemplo el ListBox o el ComboBox; y los controles tipo cuadr’cula que visualizan mœltiples filas con mœltiples columnas, como es el caso del DataGrid o su ÒhermanoÓ de la versi—n 2005 el DataGridView. Vamos a centrarnos en este œltimo tipo de vinculaci—n.

 

Vinculaci—n con mœltiples filas, mœltiples columnas.

 

El œnico control que tiene la particularidad de mostras varias filas y varias columnas facilitando as’ el acceso a tablas completas es el DataGrid. El control DataGridView nos permite mostrar vistas sobre un conjunto de datos. Estas vistas pueden tener su origen en una sola tabla (un objeto DataView) o varias tablas relacionadas (un objeto DataViewManager). Independientemete del control de que se trate, las dos propiedades de enlace son:

 

¤       DataSource: Recibe el origen de datos. Puede ser un DataSet, un DataView o un DataSet y una tabla, en cuyo caso no es necesario especificar la siguiente propiedad.

¤       DataMember: Nombre de la tabla o vista.

 

Los controles que se vinculan con una sola columna mediante DataBindings no tienen noci—n de la fila en la que se encuentran en el conjunto de datos, puesto que s—lo conoce el valor de una fila en una columna. Es el propio formulario el encargado de crear los elementos necesarios para asegurar la sincronizaci—n entre los distintos controles vinculados a datos, impidiendo que cada uno de ellos muestre columnas de distintas filas.

 

Todos los formularios Windows cuentan con un objeto BindingContext al que podemos acceder mediante la propiedad del mismo nombre del formulario. Su finalidad es mantener una lista de objetos, uno para cada uno de los or’genes de datos que existan, que se encargar‡n de mantener la sincronizaci—n entre los controles.

 

Los elementos de BindingContext son del tipo BindingManagerBase, una clase abstracta que cuenta con dos derivadas: CurrencyManager (cuando se necesita saber quŽ fila es la actual) y CurrencyProperty (cuando no).

 

Conociendo el origen de datos es f‡cil recuperar el CurrencyManager asociado mediante el siguiente c—digo:

BindingContext(<dataSet>, <nombre tabla>)

Este objeto es el que mantiene la posici—n actual en la lista de datos. Las dos propiedades m‡s importantes de los objetos de esta clase son:

 

¤       Position: Devuelve o establece la fila actual (hay que tener en cuenta que la primera fila tiene ’ndice 0).

¤       Count: Devuelve el nœmero de filas existentes.

 

 

CurrencyManager.

 

Una fuente de datos controla la posici—n entre sus registros usando un objeto CurrencyManager. ƒste supervisa la lista de objetos enlazados a datos utillizada para su control. Las propiedades m‡s usadas de CurrencyManager son:

 

Propiedad

Descripci—n

Bindings

Una colecci—n con los enlaces que el objeto controla.

Count

Devuelve el nœmero de filas asociadas al objeto.

Current

Devuelve una referencia a la fila actual.

List

Devuelve un objeto que implementa la interface Ilist que provee de datos al objeto CurrencyManager.

Position

Devuelve o establece la posici—n de la fila actual.

 

El objeto CurrencyManager tambiŽn implementa algunos mŽtodos para la manipulaci—n de datos. Los m‡s usados son:

 

MŽtodo

Descripci—n

AddNew

A–ade un nuevo item a la fuente de datos.

CancelCurrentEdit

Cancela la operaci—n de edici—n en curso.

EndCurrentEdit

Termina la operaci—n de edici—n en curso, aceptando cualquier cambio.

Refresh

Puebla de nuevo los controles enlazados.

RemoveAt

Elimina el item con el ’ndice especificado de la fuente de datos.

 

La clase CurrencyManager lanza un evento PositionChanged cada vez que cambia el registro activo.

 

Una vez que declaramos un objeto CurrencyManager:

 

Private myCurrencyManger As CurrencyManager

 

É debemos salvar una referencia del mismo nuestra tabla.

 

myCurrencyManager =  DirectCast(Me.BindingContext(myDataTable), CurrencyManager)

 

Suponemos que myDataTable es un objeto DataTable definido y poblado con anterioridad. BindingContext es una colecci—n que contiene referencias a los objetos BindingManagerBase usados por los controles del formulario. Este c—digo pasa el objeto DataTable como un par‡metro de BindingContext para obtener el CurrencyManager de la tabla. DirectCast es una funci—n que se utiliza para conversiones de tipo basadas en herencia e implementaci—n (funciona de forma m‡s eficiente que CType cuando manejamos objetos).

 

Una vez hecho esto, para manipular el registro activo podemos hacer:

 

myCurrencyManager.Position += 1

 

que har’a que el registro activo fuese el siguiente en la tabla.

 

Si la fuente de datos contiene mœltiples objetos (por ejemplo, un DataSet puede contener varios DataTables) necesitamos pasar a la colecci—n una ruta a los objetos que queremos usar. Por ejemplo supongamos un DataViewManager enlazado a una vista que visualiza un conjunto de datos de dos tablas relacionadas ÒsociosÓ (tabla principal)  y ÒcargosÓ (que describe el cargo del socio en la empresa). El c—digo podr’a ser este:

 

ÔDeclaramos la vista

Dim miVista As New DataViewManager(miDataSet)

ÔEnlazamos el DataGridView a la vista

dtgRegistros.DataSource = miVista

dtgRegistros.DataMember = ÒsociosÓ

ÔCreamos la referencia al objeto CurrencyManager

myCurrencyManager=DirectCast(Me.BindingContext(miVista, ÒsociosÓ), CurrencyManager)