Colaboraciones en el Guille

DataBindings en Visual Basic .Net

Maestro - Detalle 

Fecha: 12/Oct/2005 (10 de Octubre de 2005)
Autor: Ing. Fernando Luque Sánchez - DCE 4 Estrellas
[email protected]

Un poco de teoría

Sres. Desarrolladores, reiniciando mis publicaciones comparto con ustedes un pequeño ejemplo que detalla el uso de DataBindings, esta propiedad obtiene los enlaces de datos del control. La propiedad DataBinding se utiliza para obtener acceso al ControlBindingsCollection que representa a la colección de enlaces de datos de un control.

Al enlazar un control a datos usando DataBindings se puede enlazar cualquier propiedad de un control a la propiedad de un objeto...que como se hace, de la siguiente forma:

'Bindings para las cajas de texto

txtApellido.DataBindings.Add("Text", dtEmpleados, "LastName")

txtApellido.DataBindings.Add("Tag", dtEmpleados, "EmployeeID")

txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName")

En las líneas de código precedentes se han agregado DataBindings a dos cajas de texto, al control con nombre txtApellido se ha relacionado las propiedades Text y Tag a los objetos LastName y EmployeeID del DataTable dtEmpleados respectivamente.

Al control TextBox con nombre txtNombre se ha relacionado o enlazado con el objeto FirsName  del DataTable con nombre dtEmpleados.

La Clase BindingContext

Para manejar la navegación entre los registros podemos utilizar un BindingContext que administra la colección de objetos BindingManagerBase para cualquier objeto que se herede de la clase Control. El BindigManagerBase permite la sincronización de controles con enlace al mismo origen. La Clase CurrencyManager que administra la lista de objetos Binding se hereda de la clase BindingManagerBase y mantiene  sincronizados los controles señalando el elemento actual de la lista.

Normalmente, se utiliza el objeto BindingContext de la clase Form con el fin de devolver objetos BindingManagerBase para los controles con enlace a datos del formulario. Si se utiliza un control contenedor, como GroupsBox, Panel o TabControl, para incluir controles con enlace a datos, se puede crear un objeto BindingContext sólo para ese control contenedor y sus controles. De este modo, cada parte de un formulario puede ser administrada por su propio objeto BindingManagerBase.

En el ejemplo para los botones de navegación entre registros he utilizado en BindingContext de la clase Form, el objeto dtEmpleados y la propiedad Position para visualizarlos individualmente, el código se muestra como sigue:

Private Sub Mover(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cmdPrimero.Click, cmdAnterior.Click, _
        cmdSiguiente.Click, cmdUltimo.Click

        If sender Is cmdPrimero Then
            Me.BindingContext(dtEmpleados).Position = 0
        ElseIf sender Is cmdAnterior Then
            Me.BindingContext(dtEmpleados).Position -= 1
        ElseIf sender Is cmdSiguiente Then
            Me.BindingContext(dtEmpleados).Position += 1
        ElseIf sender Is cmdUltimo Then
            Me.BindingContext(dtEmpleados).Position = dtEmpleados.Rows.Count - 1
        End If
        dvVentas.RowFilter = "EmployeeID = " & txtApellido.Tag.ToString
End Sub

El ejemplo

El formulario tiene el siguiente aspecto:

DataBindings...un ejemplo

A continuación sigue código en Visual Basic (o C# o C++.NET):

En la zona de declaraciones:

     'Elementos necesarios

    Dim cn As SqlConnection     'conexion
    'Adaptadores

    Dim daEmpleados As SqlDataAdapter
    Dim daOrdenes As SqlDataAdapter
    Dim daDetalle As SqlDataAdapter
    Dim daVentas As SqlDataAdapter

    'DataTables
    Dim dtEmpleados As DataTable
    Dim dtOrdenes As DataTable
    Dim dtDetalle As DataTable
    Dim dtVentas As DataTable

    'vistas
    Dim dvOrdenes As DataView
    Dim dvDetalle As DataView
    Dim dvVentas As DataView

    'El dataset
    Dim dsDatos As DataSet

 

Al cargar el Windows Form

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

        cn = New SqlConnection("user id=sa;initial catalog=Northwind;persist security info=False")
        dsDatos = New DataSet

        'Adaptadores: Empleados, Órdenes y Detalle de las Órdenes

        daEmpleados = New SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, HireDate FROM Employees", cn)
        daEmpleados.Fill(dsDatos, "Empleados")

        'Ordenes 
        Dim vInsOrdenes As String
        vInsOrdenes = "SELECT Od.OrderID, SUM(CONVERT(money, (Od.UnitPrice * " & _
                    "   Od.Quantity) * (1 - Od.Discount) / 100) * 100) " & _
                    "   AS Total, o.EmployeeID, o.OrderDate, " & _
                    "   c.CompanyName" & vbCrLf & _
                    "FROM [Order Details] Od " & _
                    "   INNER JOIN Orders o " & _
                    "   ON Od.OrderID = o.OrderID" & vbCrLf & _
                    "   INNER JOIN Customers c " & _
                    "   ON o.CustomerID = c.CustomerID" & vbCrLf & _
                    "GROUP BY Od.OrderID, o.EmployeeID, o.OrderDate, c.CompanyName"

        'Esta instruccion select tiene 5 campos: OrderID, Total orden,

        'Id del empleado, Fecha y Nombre de la compañía

        daOrdenes = New SqlDataAdapter(vInsOrdenes, cn)
        daOrdenes.Fill(dsDatos, "Ordenes")

        'EMPLEADOS y su total de Ventas

        Dim vInsVentas As String
        vInsVentas = "SELECT e.employeeid, sum(UnitPrice * Quantity) as " & _
                    "   'Total Ventas' " & _
                    "FROM [order details] od " & _
                    "   INNER JOIN orders o " & _
                    "   ON o.orderid = od.orderid " & _
                    "   INNER JOIN employees e " & _
                    "   ON e.employeeid = o.employeeid" & vbCrLf & _
                    "GROUP BY e.employeeid"

        daVentas = New SqlDataAdapter(vInsVentas, cn)
        daVentas.Fill(dsDatos, "Ventas")

        'Detalle de las ordenes
        Dim vinsDetalle As String
        vinsDetalle = "SELECT od.OrderID, od.UnitPrice, od.Quantity, od.Discount, " & _
                    "       p.ProductName, c.CategoryName, " & _
                    "       (od.UnitPrice * od.Quantity) As SubTotal " & _
                    "FROM [order details] od " & _
                    "   INNER JOIN Products p ON od.ProductID = p.ProductID " & _
                    "   INNER JOIN Categories c ON c.CategoryID = p.CategoryID " & _
                    "ORDER BY od.OrderID"

        daDetalle = New SqlDataAdapter(vinsDetalle, cn)
        daDetalle.Fill(dsDatos, "Detalle")

        'Definicion de los DataTables

        dtEmpleados = dsDatos.Tables("Empleados")
        dtOrdenes = dsDatos.Tables("Ordenes")
        dtDetalle = dsDatos.Tables("Detalle")
        dtVentas = dsDatos.Tables("Ventas")

        'Las Vistas
        dvOrdenes = dtOrdenes.DefaultView
        dvDetalle = dtDetalle.DefaultView
        dvVentas = dtVentas.DefaultView

        'Procedimiento para crear los Bindings

        CrearBindings()
        dvVentas.RowFilter = "EmployeeID = " & txtApellido.Tag.ToString
        'Mostrar las Ordenes, el Detalle y el Registro
        Mostrarordenes()
        MostrarDetalle()
        RegistroActual()
    End Sub

El código completo se encuentra en el archivo adjunto. Bájalo y no te olvides de votar, tus puntos me alientan a seguir compartiendo.

Suerte a todos y a seguir desarrollado.

Ing. Fernando Luque Sánchez
DCE 4 Estrellas


Espacios de nombres usados en el código de este artículo:

System.Data
System.DataSQLClient


Fichero con el código de ejemplo: FernandoLuque_DataBindings2.zip - (49) KB


ir al índice principal del Guille