Cap’tulo 8Vinculaci—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:
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)