Empleo de Data Binding simple para navegar y editar datos

Empleo de Data Binding simple para navegar y editar datos

En el proyecto DataBindSimple (hacer clic aquí para acceder a este ejemplo) vamos a utilizar los elementos de enlace a datos comentados en el apartado anterior, para construir un formulario en el

© Grupo EIDOS 37. Conjuntos de datos y enlace (Data Binding)

que, gracias a la arquitectura de enlace automático proporcionado por la plataforma .NET, simplificaremos en gran medida el acceso a datos hacia una tabla de un DataSet.

El diseño del formulario será muy similar al realizado para el ejemplo de navegación y edición manual, descrito en un apartado anterior. Ver Figura 347.

Figura 347. Formulario utilizado en Data Binding automático.

Pasando al código de la clase del formulario, deberemos realizar las siguientes declaraciones a nivel de clase, mostradas en el Código fuente 577.

Imports System.Data.SqlClient

Public Class Form1 Inherits System.Windows.Forms.Form

Private oDataAdapter As SqlDataAdapter Private oDataSet As DataSet Private oBMB As BindingManagerBase '.... '....

Código fuente 577

En el evento de carga del formulario, aparte de la creación de los objetos de conexión, adaptador, etc., estableceremos el enlace entre los controles y el DataSet, como se muestra en el Código fuente 578.

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

' crear conexión Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _

Programación con Visual Basic .NET © Grupo EIDOS

"Database=Gestion;uid=sa;pwd=;"

' crear adaptador oDataAdapter = New SqlDataAdapter("SELECT * FROM Clientes", oConexion)

' crear commandbuilder Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)

' crear dataset oDataSet = New DataSet() oDataAdapter.Fill(oDataSet, "Clientes")

' enlazar controles del formulario con el dataset; ' se debe utilizar un objeto Binding, al crear este objeto ' indicar en su constructor qué propiedad del control ' se debe enlazar, el dataset, y el nombre de tabla-columna; ' una vez creado el objeto Binding, añadirlo a la colección ' de enlaces de datos, DataBindings, del control que necesitemos, ' con el método Add() de dicha colección Dim oBind As Binding oBind = New Binding("Text", oDataSet, "Clientes.IDCliente") Me.txtIDCliente.DataBindings.Add(oBind) oBind = Nothing

oBind = New Binding("Text", oDataSet, "Clientes.Nombre") Me.txtNombre.DataBindings.Add(oBind) oBind = Nothing

oBind = New Binding("Text", oDataSet, "Clientes.FIngreso") 'AddHandler oBind.Format, AddressOf FormatoFecha Me.txtFIngreso.DataBindings.Add(oBind) oBind = Nothing

oBind = New Binding("Text", oDataSet, "Clientes.Credito") Me.txtCredito.DataBindings.Add(oBind) oBind = Nothing

' obtener del contexto de enlace del formulario, ' el enlace de un dataset y una tabla determinadas Me.oBMB = Me.BindingContext(oDataSet, "Clientes")

Me.VerContadorReg()

End Sub

Private Sub VerContadorReg() ' mostrar información sobre el número de ' registro actual y registros totales ' en la tabla del dataset Me.lblRegistro.Text = "Registro: " & _

Me.oBMB.Position + 1 & " de " & Me.oBMB.Count

End Sub

Código fuente 578

Debido al enlace automático, el código para las operaciones de navegación se simplifica en gran medida, como muestra el Código fuente 579, en el que vemos los manipuladores de evento para los botones de desplazamiento del formulario.

Private Sub btnAvanzar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAvanzar.Click

© Grupo EIDOS 37. Conjuntos de datos y enlace (Data Binding)

' avanzar a la siguiente fila; ' la actualización de los controles con los datos ' de la fila en la que acabamos de posicionarnos ' es automática, gracias al objeto BindingManagerBase Me.oBMB.Position += 1 Me.VerContadorReg()

End Sub

Private Sub btnRetroceder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRetroceder.Click

Me.oBMB.Position -= 1 Me.VerContadorReg()

End Sub

Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimero.Click

Me.oBMB.Position = 0 Me.VerContadorReg()

End Sub

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click

Me.oBMB.Position = Me.oBMB.Count - 1 Me.VerContadorReg()

End Sub

Código fuente 579

La Figura 348 muestra este formulario en ejecución.

Figura 348. Ejecución del formulario con Data Binding.

Programación con Visual Basic .NET © Grupo EIDOS

Como detalle importante a observar en las operaciones de navegación entre los registros, destacaremos el hecho de que al mostrar el campo que contiene una fecha, dicho dato se muestra con toda la información al completo, fecha y hora, sin ningún formato específico.

Para conseguir en este caso, que la fecha se muestre con el formato que necesitemos, al crear el objeto Binding para ese control, deberemos asignar a su evento Format un procedimiento manipulador, que realice tal formateo y lo devuelva a través del objeto ConvertEventArgs, que recibe ese evento. Veamos estas operaciones en el Código fuente 580.

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

'.... oBind = New Binding("Text", oDataSet, "Clientes.FIngreso") AddHandler oBind.Format, AddressOf FormatoFecha Me.txtFIngreso.DataBindings.Add(oBind) oBind = Nothing '....

End Sub

' manipulador del Evento format del objeto Binding Private Sub FormatoFecha(ByVal sender As Object, ByVal e As ConvertEventArgs)

Dim dtFecha As DateTime dtFecha = e.Value e.Value = dtFecha.ToString("dd-MMMM-yyyy")

End Sub

Código fuente 580

La Figura 349 muestra ahora este control al haberle aplicado el formato.

Figura 349. Control enlazado a datos, que muestra una fecha con formato personalizado.

El proceso de edición (inserción en este ejemplo), es muy similar al caso anterior. Aunque debemos tener en cuenta que debido a las particularidades del Data Binding, no podemos borrar el contenido de los TextBox, teclear datos e insertarlos, ya que eso realmente modificaría el registro sobre el que estábamos posicionados. Por ese motivo, en el botón Insertar, asignamos los valores directamente a las columnas del objeto DataRow. Ver el Código fuente 581.

Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsertar.Click

Dim oDataRow As DataRow

© Grupo EIDOS 37. Conjuntos de datos y enlace (Data Binding)

' crear un nuevo objeto fila oDataRow = Me.oDataSet.Tables("Clientes").NewRow() ' añadir datos a las columnas de la fila oDataRow("IDCliente") = 100 oDataRow("Nombre") = "Isabel" oDataRow("FIngreso") = "12/9/01" oDataRow("Credito") = 228 ' añadir el objeto fila a la colección ' de filas de la tabla Me.oDataSet.Tables("Clientes").Rows.Add(oDataRow)

End Sub

Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActualizar.Click

Me.oDataAdapter.Update(Me.oDataSet, "Clientes")

End Sub

Código fuente 581

El control DataGrid, relaciones y vistas