Enlace de objetos en Visual Studio

Visual Studio proporciona herramientas en tiempo de diseño para trabajar con objetos personalizados (en oposición a otros conjuntos de datos como entidades, conjuntos de datos y servicios) como origen de datos de la aplicación.

Requisitos de los objetos

El único requisito para que los objetos personalizados trabajen con las herramientas de diseño de datos de Visual Studio es que deben contar al menos con una propiedad pública.

Generalmente, los objetos personalizados no exigen interfaces, constructores o atributos específicos que actúen como un origen de datos para una aplicación. Sin embargo, si desea arrastrar el objeto de la ventana Orígenes de datos a una superficie de diseño para crear un control enlazado a datos, y si el objeto implementa la interfaz IListSource o ITypedList, el objeto debe tener un constructor predeterminado (es decir, un constructor sin parámetros). De lo contrario, Visual Studio no puede crear instancias del objeto de origen de datos y mostrará un error al arrastrar el elemento a la superficie de diseño.

Ejemplos de utilizar objetos personalizados como orígenes de datos

Si bien existen innumerables formas de implementar la lógica de aplicación cuando se trabaja con objetos como origen de datos, existen algunas operaciones estándar que pueden simplificarse si se utilizan los objetos TableAdapter generados por Visual Studio. Esta página explica cómo implementar estos procesos estándar mediante TableAdapters; no está pensada como una guía para crear los objetos personalizados. Por ejemplo, generalmente realizará las operaciones estándar siguientes sin tener en cuenta la implementación concreta de sus objetos ni la lógica de la aplicación:

  • Cargar datos en objetos (normalmente de una base de datos).

  • Crear una colección con tipo de objetos.

  • Agregar y quitar objetos de una colección.

  • Mostrar los datos de objeto a los usuarios en un formulario.

  • Cambiar/editar los datos de un objeto.

  • Guardar datos de objetos en la base de datos.

Nota

Para entender mejor los ejemplos de esta página y proporcionar un contexto, sugerimos que realice el siguiente tutorial: Tutorial: Conectar a los datos en objetos (Windows Forms). Este tutorial crea los objetos que se utilizan en esta página de Ayuda.

Cargar datos en objetos

Para este ejemplo, carga los datos en los objetos utilizando TableAdapters. De forma predeterminada, los TableAdapters se crean con dos tipos de métodos que obtienen datos de una base de datos y rellenan tablas de datos.

  • El método TableAdapter.Fill rellena una tabla de datos existente con los datos devueltos.

  • El método TableAdapter.GetData devuelve una nueva tabla de datos rellenada con datos.

La forma más sencilla de cargar datos en los objetos personalizados consiste en llamar al método TableAdapter.GetData, recorrer la colección de filas de la tabla de datos devuelta y rellenar cada objeto con los valores de cada fila. Puede crear un método GetData que devuelva una tabla de datos rellenada para cualquier consulta agregada a un TableAdapter.

Nota

Visual Studio denomina las consultas de TableAdapter Fill y GetData de forma predeterminada, pero estos nombres se pueden cambiar a cualquier nombre de método válido.

El ejemplo siguiente muestra cómo recorrer las filas de una tabla de datos y rellenar un objeto con datos:

Para obtener un ejemplo de código completo, vea Tutorial: Conectar a los datos en objetos (Windows Forms).

Private Sub LoadCustomers()
    Dim customerData As NorthwindDataSet.CustomersDataTable =
        CustomersTableAdapter1.GetTop5Customers()

    Dim customerRow As NorthwindDataSet.CustomersRow

    For Each customerRow In customerData
        Dim currentCustomer As New Customer()
        With currentCustomer

            .CustomerID = customerRow.CustomerID
            .CompanyName = customerRow.CompanyName

            If Not customerRow.IsAddressNull Then
                .Address = customerRow.Address
            End If

            If Not customerRow.IsCityNull Then
                .City = customerRow.City
            End If

            If Not customerRow.IsContactNameNull Then
                .ContactName = customerRow.ContactName
            End If

            If Not customerRow.IsContactTitleNull Then
                .ContactTitle = customerRow.ContactTitle
            End If

            If Not customerRow.IsCountryNull Then
                .Country = customerRow.Country
            End If

            If Not customerRow.IsFaxNull Then
                .Fax = customerRow.Fax
            End If

            If Not customerRow.IsPhoneNull Then
                .Phone = customerRow.Phone
            End If

            If Not customerRow.IsPostalCodeNull Then
                .PostalCode = customerRow.PostalCode
            End If

            If Not customerRow.Is_RegionNull Then
                .Region = customerRow._Region
            End If

        End With

        LoadOrders(currentCustomer)
        CustomerBindingSource.Add(currentCustomer)
    Next
End Sub
private void LoadCustomers()
{
    NorthwindDataSet.CustomersDataTable customerData = 
        customersTableAdapter1.GetTop5Customers();

    foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
    {
        Customer currentCustomer = new Customer();
        currentCustomer.CustomerID = customerRow.CustomerID;
        currentCustomer.CompanyName = customerRow.CompanyName;

        if (customerRow.IsAddressNull() == false)
        {
            currentCustomer.Address = customerRow.Address;
        }

        if (customerRow.IsCityNull() == false)
        {
            currentCustomer.City = customerRow.City;
        }

        if (customerRow.IsContactNameNull() == false)
        {
            currentCustomer.ContactName = customerRow.ContactName;
        }

        if (customerRow.IsContactTitleNull() == false)
        {
            currentCustomer.ContactTitle = customerRow.ContactTitle;
        }

        if (customerRow.IsCountryNull() == false)
        {
            currentCustomer.Country = customerRow.Country;
        }

        if (customerRow.IsFaxNull() == false)
        {
            currentCustomer.Fax = customerRow.Fax;
        }

        if (customerRow.IsPhoneNull() == false)
        {
            currentCustomer.Phone = customerRow.Phone;
        }

        if (customerRow.IsPostalCodeNull() == false)
        {
            currentCustomer.PostalCode = customerRow.PostalCode;
        }

        if (customerRow.IsRegionNull() == false)
        {
            currentCustomer.Region = customerRow.Region;
        }

        LoadOrders(currentCustomer);
        customerBindingSource.Add(currentCustomer);
    }
}

Crear una colección con tipo de objetos

Puede crear clases de colección para los objetos o utilizar las colecciones con tipo que proporciona automáticamente BindingSource (Componente).

Cuando cree una clase de colección personalizada para los objetos, sugerimos que herede de BindingList<T>. Esta clase genérica proporciona funcionalidad para administrar la colección así como la posibilidad de iniciar eventos que envían notificaciones a la infraestructura de enlace de datos en formularios Windows Forms.

La colección generada automáticamente en BindingSource utiliza BindingList<T> para su colección con tipo. Si la aplicación no requiere función adicional, puede mantener su colección dentro de BindingSource. Para obtener más información, vea la propiedad List de la clase BindingSource.

Nota

Si la colección precisa funcionalidad que no proporciona la implementación base de BindingList<T>, debe crear una colección personalizada para agregar a la clase cuando lo necesite.

En el código siguiente se muestra cómo crear la clase para una colección con establecimiento inflexible de objetos Order:

''' <summary>
''' A collection of Orders
''' </summary>
Public Class Orders
    Inherits System.ComponentModel.BindingList(Of Order)

    ' Add any additional functionality required by your collection.

End Class
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

Agregar objetos a una colección

Para agregar objetos a una colección llama al método Add de su clase de colección personalizada o de BindingSource.

Para obtener un ejemplo de cómo agregar a una colección utilizando BindingSource, vea el método LoadCustomers en Tutorial: Conectar a los datos en objetos (Windows Forms).

Para obtener un ejemplo de cómo agregar objetos a una colección personalizada, vea el método LoadOrders, en Tutorial: Conectar a los datos en objetos (Windows Forms).

Nota

El método Add se proporciona automáticamente para la colección personalizada cuando hereda de BindingList<T>.

En el código siguiente se muestra cómo agregar objetos a la colección con tipo en BindingSource:

Dim currentCustomer As New Customer()
CustomerBindingSource.Add(currentCustomer)
Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

En el código siguiente se muestra cómo agregar objetos a una colección con tipo que hereda de BindingList<T>:

Nota

En este ejemplo, la colección Orders es una propiedad del objeto Customer.

Dim currentOrder As New Order()
currentCustomer.Orders.Add(currentOrder)
Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

Quitar objetos de una colección

Para quitar objetos de una colección llama al método Remove o al método RemoveAt de su clase de colección personalizada o de BindingSource.

Nota

Los métodos Remove y RemoveAt se proporcionan automáticamente para la colección personalizada cuando hereda de BindingList<T>.

En el código siguiente se muestra cómo buscar y quitar objetos de la colección con tipo en BindingSource con el método RemoveAt:

Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

Mostrar datos de objetos a los usuarios

Para mostrar los datos de los objetos a los usuarios, crea un origen de datos de objeto con Asistente para la configuración de orígenes de datos y, a continuación, arrastra el objeto completo o propiedades individuales al formulario desde la ventana Orígenes de datos.

Para obtener más información sobre cómo crear un origen de datos de objeto, vea Cómo: Conectarse a los datos en objetos.

Para obtener más información sobre cómo mostrar datos de objetos en formularios Windows Forms, vea Enlazar controles a los datos en Visual Studio.

Modificar los datos de objetos

Para editar datos en objetos personalizados enlazados con datos a controles de formularios Windows Forms, edite los datos en el control enlazado (o directamente en las propiedades del objeto). La arquitectura de enlace de datos actualizará los datos en el objeto.

Si la aplicación requiere efectuar el seguimiento de los cambios y revertir los cambios propuestos, debe implementar esta funcionalidad en el modelo de objetos. Para obtener ejemplos de cómo las tablas de datos mantienen el seguimiento de los cambios propuestos, vea DataRowState, HasChanges y GetChanges.

Guardar datos de objetos en la base de datos

Los datos se vuelven a guardar en la base de datos pasando los valores del objeto a los métodos DBDirect de los TableAdapter.

Visual Studio crea métodos DBDirect que se pueden ejecutar directamente en la base de datos. Estos métodos no requieren objetos DataSet ni DataTable.

Método DBDirect de TableAdapter

Descripción

TableAdapter.Insert

Agrega nuevos registros a una base de datos, permitiendo pasar valores de columna individuales como parámetros de método.

TableAdapter.Update

Actualiza registros existentes en una base de datos. El método Update toma los valores originales y nuevos de la columna como parámetros de método. Los valores originales se utilizan para buscar el registro original y los nuevos valores se utilizan para actualizar ese registro.

El método TableAdapter.Update también se utiliza para reconciliar los cambios de un conjunto de datos en la base de datos, tomando DataSet, DataTable, DataRow o una matriz de DataRows como parámetros del método.

TableAdapter.Delete

Elimina registros existentes de la base de datos basándose en los valores de columna originales pasados como parámetros de método.

Para guardar datos de una colección de objetos, recorra la colección (por ejemplo, utilizando un bucle for-next) y envíe los valores de cada objeto a la base de datos con los métodos DBDirect del TableAdapter.

El ejemplo siguiente muestra cómo utilizar el método DBDirect TableAdapter.Insert para agregar directamente un nuevo cliente en la base de datos:

Private Sub AddNewCustomer(ByVal currentCustomer As Customer)

    CustomersTableAdapter.Insert(
        currentCustomer.CustomerID,
        currentCustomer.CompanyName,
        currentCustomer.ContactName,
        currentCustomer.ContactTitle,
        currentCustomer.Address,
        currentCustomer.City,
        currentCustomer.Region,
        currentCustomer.PostalCode,
        currentCustomer.Country,
        currentCustomer.Phone,
        currentCustomer.Fax)
End Sub
private void AddNewCustomers(Customer currentCustomer)
{
    customersTableAdapter.Insert( 
        currentCustomer.CustomerID, 
        currentCustomer.CompanyName, 
        currentCustomer.ContactName, 
        currentCustomer.ContactTitle, 
        currentCustomer.Address, 
        currentCustomer.City, 
        currentCustomer.Region, 
        currentCustomer.PostalCode, 
        currentCustomer.Country, 
        currentCustomer.Phone, 
        currentCustomer.Fax);
}

Vea también

Tareas

Cómo: Conectarse a los datos en objetos

Tutorial: Conectar a los datos en objetos (Windows Forms)

Cómo: Guardar los datos de un objeto en una base de datos

Cómo: Obtener acceso directamente a la base de datos con un TableAdapter

Tutorial: Guardar datos con los métodos DBDirect de un TableAdapter

Conceptos

Enlazar controles a los datos en Visual Studio

Otros recursos

TableAdapters

Guardar datos