TEMA 9. CONTROLES WINDOWS DE ENLACE A DATOS 9.1. VINCULAR CONTROLES AL CONJUNTO DE DATOS · 2010....
Transcript of TEMA 9. CONTROLES WINDOWS DE ENLACE A DATOS 9.1. VINCULAR CONTROLES AL CONJUNTO DE DATOS · 2010....
9.1Programación .NET (II). Controles Windows de enlace a datos
TEMA 9. CONTROLES WINDOWS DE ENLACE A DATOS
9.1. VINCULAR CONTROLES AL CONJUNTO DE DATOS
Hemos visto cómo recuperar datos de
un origen de datos directamente
mediante adaptadores de datos y
lectores. Normalmente, en las
aplicaciones, va a ser más frecuente
que el usuario trabaje con los datos a
través de una interfaz que les facilite la
visualización y manipulación de los
datos.
Como desarrolladores vamos a contar
con controles enlazables a datos para
crear este tipo de interfaces. Ahora
veremos cómo enlazar directamente
controles a objetos contenedores de datos, lo que se conoce como DataBinding.
Al enlazar los controles a los datos, no sólo vamos a poder visualizar los datos
en los controles, sino que podremos contemplar su modificación y
actualización. Así, el usuario podrá, desde un formulario de Windows
interactuar con los datos desde los controles del formulario.
Tipos de enlace a datos
Simple.
Un enlace a datos simple consiste en el enlace entre un control quemuestra un único valor y los datos de un origen.
Un ejemplo de este tipo de enlace sería un control TextBox enlazado a un
objeto DataColumn de una tabla de un conjunto de datos.
Programación .NET (II). Controles Windows de enlace a datos9.2
Complejo.
Consiste en vincular a los datos un control que puede mostrar múltiplesvalores.
El ejemplo más típico de este tipo de enlace sería un control DataGridView
enlazado a un objeto DataTable de un conjunto de datos.
Principales elementos del enlace a datos
Vamos a poder enlazar datos a controles no sólo desde orígenes de datos,
sino que también podremos enlazar cualquier colección estructurada dedatos, como colecciones o propiedades de otros controles.
Todos los controles que admiten el enlace de datos tienen una colección de tipo
DataBindingsCollection, a la que podremos acceder a través de la
propiedad DataBindings. Esta colección está compuesta por objetos de la
clase Binding.
El objeto Binding nos va a permitir crear un enlace para un control. Al crear el
enlace indicaremos la propiedad del control que se enlaza, el objeto quecontiene los datos a enlazar y el campo del origen vinculado.
Una vez creado el enlace, podemos añadirlo a la colección de DataBindings del
control. A continuación puedes ver un sencillo ejemplo en el que se realiza esta
operación mediante código.
Me.SqlDataAdapter1.Fill(Me.DataSet11, "Agenda")
Dim enlace As Binding
'Enlazamos la propiedad Text con el campo Telefono de la tabla Agenda
enlace = New Binding("Text", Me.DataSet11.Tables("Agenda"), "Telefono")
'Añadimos el enlace a la colección de enlaces del TextBox.
Me.TextBox1.DataBindings.Add(enlace)
9.3Programación .NET (II). Controles Windows de enlace a datos
Otro objeto interesante es BindingSource, que encapsula el origen dedatos de nuestro formulario y facilita enormemente la manipulación y
enlace de los datos.
Después veremos cómo a través del IDE de Visual Basic, mediante asistentes,
podremos enlazar de forma sencilla controles a datos en tiempo de diseño, así
como BindingSource nos ayudará a manipular el conjunto de datos.
Para comprender cómo funcionan estos elementos vamos a recurrir a un
ejemplo que ponga a trabajar a algunos de ellos.
Lo primero, creamos en una nueva aplicación para Windows el siguiente
formulario, inicializando paa cada control las propiedades que se indican:
Lo siguiente que hacemos es crear un origen de datos y un conjunto dedatos basado en él, a través del menú “Datos”
Programación .NET (II). Controles Windows de enlace a datos9.4
Como origen de datos usamos la base de datos “nueva.mdf” anteriormente
creada para nuestra agenda. Llamamos al conjunto de datos “DataSetAgenda”
e incluimos en él la tabla “Agenda”.
Una vez que tenemos el conjunto de datos en nuestro proyecto,podemos vincular nuestros controles (las cajas de texto en nuestrocaso) a los campos de datos correspondientes.
Para ello, modificamos la propiedad DataBindings de cada caja de texto,
creando los enlaces a los campos correspondientes de la tabla “Agenda”.
A continuación vamos a vincular la propiedad Text de la caja de texto “Nif” con
el campo “Nif” de la tabla “Agenda” contenida en nuestro conjunto de datos. El
proceso con el resto de controles sería el mismo.
9.5Programación .NET (II). Controles Windows de enlace a datos
Hacemos los siguiente:
Vemos las propiedades de la caja de texto “Nif”. Nos interesa la propiedad
DataBindings, si la desplegamos vemos lo siguiente:
Aparecen las propiedades que con más frecuencia se enlazan a datos, Tag y
Text. Pulsamos en (Avanzado) para ver la ventan de enlace de datos avanzado.
Programación .NET (II). Controles Windows de enlace a datos9.6
En este diálogo veremos a la izquierda todas las propiedades enlazables de la
caja de texto “Nif”. Podemos seleccionar la que nos interese enlazar y después
seleccionar los datos a los que queramos enlazar mediante la lista desplegable
situada debajo de “Enlazar a datos:”
Elegimos el campo NIF de la tabla Agenda en nuestro conjunto de datos. Tras
hacer esta selección se creará automáticamente un objeto de tipo
BindingSource que servirá de fuente de datos para el formulario.
Tras vincular el primer control, se ha agregado al formulario una instancia delconjunto de datos (DataSetAgenda), una fuente de datos(AgendaBindingSource) y un adaptador de datos (AgendaTableAdapter).
9.7Programación .NET (II). Controles Windows de enlace a datos
En la propiedad Text de la caja Nif ha aparecido una marca que indica su vínculo
a datos.
Programación .NET (II). Controles Windows de enlace a datos9.8
Vinculamos los demás controles de igual forma, seleccionando como origen la
fuente de datos “AgendaBindingSource” recién creada.
Al finalizar, si probamos la aplicación, veremos que el formulario muestra los
datos del primer registro de la tabla “Agenda”.
Lo siguiente que vamos a hacer es preparar los botones de nuestro formulario
para que nos permitan desplazarnos por los registros de la tabla.
Para movernos por los registros del origen de datos nos valdremos delobjeto de clase BindingSource que tenemos en el formulario(“BindingSourceAgenda”). Este objeto tiene una propiedad llamada
Position que indica o establece el índice del elemento actual en la lista
subyacente, eso es los datos que engloba.
Para avanzar o retroceder esta posición existen cuatro métodos deBindingSource, de los que nos vamos a valer: MoveFirst, MoveLast,MovePrevious, MoveNext. Con ellos nos situamos en el primer registro, elúltimo, avanzamos uno o retrocedemos uno, respectivamente.
Entonces, si queremos que el botón
nos muestre los datos en el primer registro, añadiremos el siguiente código al
evento click del botón “Primero”:
9.9Programación .NET (II). Controles Windows de enlace a datos
Para ver el último registro al pulsar el botón
añadimos el siguiente código al evento click del botón:
Avanzamos un registro pulsando
Retrocedemos un registro pulsando
Private Sub Primero_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Primero.Click
AgendaBindingSource.MoveFirst()
End Sub
Private Sub Ultimo_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Ultimo.Click
AgendaBindingSource.MoveLast()
End Sub
Private Sub Siguiente_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Siguiente.Click
AgendaBindingSource.MoveNext()
End Sub
Private Sub Anterior_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Anterior.Click
AgendaBindingSource.MovePrevious()
End Sub
Programación .NET (II). Controles Windows de enlace a datos9.10
Ahora, si iniciamos la aplicación, ahora los botones nos permiten navegar por
los registros.
Como ves, usando BindingSource es muy sencillo moverse por los registros.
Basta invocar el método correspondiente para que todas las cajas detexto actualicen sus valores con los correspondientes campos delregistro actual.
Si editamos alguno de los campos en las cajas de texto, los cambios no seactualizarán automáticamente en el origen de datos. Puede parecerlo,
porque si nos desplazamos a otro registro y después volvemos al editado,
veremos los valores modificados. Sin embargo, si paramos la aplicación y la
volvemos a iniciar, observaremos que el registro conserva los valores
inalterados, no ha habido cambios en la base “nueva.mdf”.
Esto sucede porque hemos hecho cambios en el conjunto de datos, no enel propio origen de datos. Recuerda que, al acceder a los datos con DataSets,
estamos trabajando con un modelo de datos desconectado. Será necesario
realizar, con posterioridad a la edición, la actualización de los datos en la base
de datos.
¿Cómo guardar los cambios? Haremos unas modificaciones en la aplicación.
Añadimos tres botones, uno para guardar los cambios realizados otro para
añadir nuevos registros y otro para borrarlos. Así la aplicación quedará
completa y nos permitirá control total de los datos.
Llamamos “Guardar” al botón que se encargará de actualizar los cambios en la
base de datos, “Añadir” al que añadirá un nuevo elemento a la lista subyacente
del BindingSource y “Borrar” al botón que eliminará el elemento actual de la
lista subyacente.
9.11Programación .NET (II). Controles Windows de enlace a datos
Nuestro formulario ya tiene un aspecto parecido al siguiente:
Preparamos el código necesario en estos nuevos botones para que la cosa
funcione.
El primer botón que vamos a preparar es el botón que añade un nuevo
elemento a la lista de registros que maneja nuestro BindingSource. Como ves,
basta con usar el método AddNew de “AgendaBindingSource”.
Para eliminar, existe el método RemoveCurrent, que elimina el elemento en
el que estemos situados actualmente. También existen métodos para eliminar
un elemento concreto (Remove) o para eliminar el elemento que ocupe cierto
índice de la lista (RemoveAt).
Private Sub Añadir_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Añadir.Click
AgendaBindingSource.AddNew()
End Sub
Programación .NET (II). Controles Windows de enlace a datos9.12
Todo esto está muy bien, pero, si pruebas la aplicación, verás que los cambios
siguen sin reflejarse en la base de datos. Al pulsar el botón que elimina el
registro este desaparecerá en nuestra aplicación, pero seguirá en la base de
datos. Y si añadimos un nuevo elemento con el botón “Añadir” nos aparecerán
las cajas de texto en blanco para añadir nuevos datos, pero… éstos no llegan
“solos” a la base de datos.
Queda pues, el último detalle. Tenemos que volcar de vuelta los datosmanejados en la aplicación a la base de datos. En el tema anterior ya
comentamos que es el adaptador de datos el que se encarga de ello. En el
código correspondiente al evento click del botón “Guardar” puedes ver que es
el adaptador de datos el que actualiza los datos en el origen, desde los datos
contenidos en el conjunto de datos que maneja la aplicación.
Private Sub Borrar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Borrar.Click
AgendaBindingSource.RemoveCurrent()
End Sub
Private Sub Actualizar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Actualizar.Click
'Con EndEdit terminamos cualquier edición que pudiera estar produciéndose
AgendaBindingSource.EndEdit()
'Usamos Try...Catch para capturar posibles errores producidos durante la
' actualización
Try
'Actualiza la BD!
AgendaTableAdapter.Update(DataSetAgenda.Agenda)
Catch ex As Exception
'Se produjo un error
MessageBox.Show(ex.Message, "Excepción", MessageBoxButtons.OK, _
MessageBoxIcon.Warning)
Exit Sub
End Try
MessageBox.Show("Se guardaron los cambios", "Actualizar", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
9.13Programación .NET (II). Controles Windows de enlace a datos
Este ejemplo nos ha permitido ver cómo podemos enlazar controles a un origen
de datos, y cómo, desde estos controles, podemos editar, añadir y eliminar
datos del mismo.
Lo hemos hecho de una forma bastante fácil, pero se pueden utilizar soluciones
aún más sencillas y que nos pueden proporcionar resultados con apariencia y
opciones más avanzadas. Son controles especialmente pensados paratrabajar con datos.
9.2. CONTROLES ESPECÍFICOS PARA TRABAJAR CON DATOS
Como ya hemos mencionado antes, existen controles especialmente
preparados para tratar datos. A continuación vamos a describir el
funcionamiento de dos de ellos: el control DataGridView (o rejilla) y el control
BindingNavigator.
El primero sirve para presentar registros de datos en una tabla o rejilla y el
segundo nos permitirá navegar entre los registros de forma similar al ejemplo
que viste en el apartado anterior.
Control BindingNavigator
Este control funciona exactamente igual que los botones que nos permitían
movernos por los registros en el ejemplo del apartado anterior.
Consta de una barra de herramientas o ToolStrip, compuesta inicialmente por
dos controles, TextBox y Label, para indicar la possición del registro actual, y
botones para recorrer, añadir y eliminar registros. Podemos decir que setrata de un control ToolStrip especializado para navegar y manipularcontroles enlazados a datos en el formulario.
A continuación mostramos los controles que incluye la barra de herramientas
del control BindingNavigator. Podremos añadir controles creados por nosotros
a esta barra, tal como explicábamos para cualquier control ToolStrip.
Programación .NET (II). Controles Windows de enlace a datos9.14
La propiedad principal de este control es BindingSource, que establece el
origen de los datos.
Para probar este control podemos modificar el ejemplo del apartado anterior
sustituyendo los botones que habíamos preparado para navegar porlos registros por un control BindingNavigator.
Por sí solo, este control no guardará los cambios realizados en el origen de
datos, por lo que vamos a incorporar un nuevo botón a la barra delBindingNavigator que guarde los cambios.
Como supondrás, el código que escribiremos en el evento click de este nuevo
ToolStripButton será el mismo que se ejecutaba con el click de nuestro primitivo
botón.
9.15Programación .NET (II). Controles Windows de enlace a datos
Vayamos por partes. Tras añadir el control BindingNavigator a nuestro
formulario deberemos asignar su propiedad BindingSource a la fuente de
datos del formulario: AgendaBindingSource. Así quedará vinculado con
nuestros datos.
Con sólo hacer esto, los botones del control BindingNavigator tendránfuncionalidad completa: ir al primer registro, al último, avanzar,retroceder, añadir y borrar el registro actual del conjunto de datos.
Programación .NET (II). Controles Windows de enlace a datos9.16
Ahora añadiremos un botón al control BindingNavigator, tal como haríamos en
un control ToolStrip, para guardar los cambios realizados, en el origen de los
datos. Lo llamamos “GuardarCambios”.
El código para el evento click de este botón será, como ya hemos dicho, similar
al que elaboramos para el ejemplo anterior:
Como ves, disponiendo de una fuente de datos o BindingSource y un control
BindingSourceNavigator en nuestro formulario, resulta muy sencillo presentar,
manipular y navegar por información procedente de un origen de datos.
Private Sub GuardarCambios_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles GuardarCambios.Click
AgendaBindingSource.EndEdit()
Try
'Actualiza la BD!
AgendaTableAdapter.Update(DataSetAgenda.Agenda)
Catch ex As Exception
MessageBox.Show(ex.Message, "Excepción", MessageBoxButtons.OK, _
MessageBoxIcon.Warning)
Exit Sub
End Try
MessageBox.Show("Se guardaron los cambios", "Actualizar", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
9.17Programación .NET (II). Controles Windows de enlace a datos
Control DataGridView
Este control nos va a permitir presentar los datos en forma de tabla.
Podremos, además, personalizar su apariencia y comportamiento en función
de nuestras necesidades.
Entre otras cosas, será posible permitir al usuario reordenar los datos, añadir,
editar, eliminar datos o modificar el aspecto de la tabla (alto de filas, ancho de
comunas).
De igual forma que pasaba con el control BindingNavigator, podremosvincular un DataGridView con un origen de datos a través de supropiedad DataSource, la cual podremos establecer en tiempo dediseño o durante la ejecución mediante programación.
Si el conjunto de datos seleccionado contiene más de una tabla, podremos
especificar una en la propiedad DataMember.
En tiempo de diseño, la forma más sencilla de configurar la rejilla será a través
de su ventana de tareas, desde donde podremos seleccionar su fuente de
datos, las columnas a visualizar y establecer las acciones sobre los datos
disponibles, entre otras.
Programación .NET (II). Controles Windows de enlace a datos9.18
Veamos ahora un ejemplo de cómo configurar un control DataGridView para
que muestre los datos de un conjunto de datos.
Una vez que hemos añadido el control DataGridView a un formulario, lo más
fácil es recurrir a su ventana de tareas.
Mediante la opción “Elegir origen de datos” podremos vincular el control con el
origen de datos deseado.
Podremos elegir las columnas de la tabla que queremos mostrar con “Editar
columnas...” y “Agrega columna...”.
Además, seleccionaremos aquí si queremos que el usuario tenga la opción de
agregar, editar o eliminar registros en la tabla, así como de ordenar los mismos
por la columna deseada.
Elegimos nuestro origen de datos:
9.19Programación .NET (II). Controles Windows de enlace a datos
Igual que ocurría al vincular una caja de texto con un origen de datos, el
vínculo con datos del control DataGridView ha provocado que se cree
automáticamente un control BindingSource (“AgendaBindingSource”).
Como ves, enlazar un control rejilla con un conjunto de datos es bastante
sencillo. No debemos olvidar que, al igual que BindingNavigator, este control
por sí solo no actualiza los datos en el origen, por lo que será necesario que el
programador incorpore los métodos necesarios para realizar esta tarea.
Es posible combinar el uso de la rejilla con el control navegador,consiguiendo así desplazarnos por las filas de la tabla rápidamente. Esto es
muy útil para grandes tablas de datos. Además, nos facilita añadir y eliminar
filas de la tabla con los botones que incorpora.
Para usar el BindingNavigator junto al DataGridView bastará con añadirlo al
formulario y establecer su propiedad BindingSource a la misma fuente de datos
a la que está vinculada la rejilla. A partir de ese momento los datos mostrados
en la rejilla estarán sincronizados con las acciones que realicemos con el
navegador.
Ejemplo. en el manejador del evento CellEndEdit de la rejilla
podemos escribir el siguiente código:
'Finaliza la edición de la celda
Me.AgendaBindingSource.EndEdit()
'Actualiza en el origen a través del adaptador
Me.AgendaTableAdapter.Update(Me.DataSet11.Agenda)