Enlazar datos a controles en soluciones de Office

Puede enlazar controles de formularios Windows Forms y controles host de un documento de Microsoft Office Word o de una hoja de cálculo de Microsoft Office Excel a un origen de datos para que muestren los datos automáticamente. Puede enlazar datos a controles en proyectos de nivel de aplicación y de nivel de documento.

Se aplica a: la información de este tema se aplica a los proyectos de nivel de documento y los proyectos de nivel de aplicación para Microsoft Office 2010 y 2007 Microsoft Office System. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.

Los controles host extienden objetos que están en el modelo de objetos de Word y de Excel, como los controles de contenido en Word y los rangos con nombre en Excel. Para obtener más información, vea Información general sobre elementos y controles Host.

Tanto los formularios Windows Forms como los controles host utilizan el modelo de enlace de datos de los formularios Windows Forms, que admite el enlace de datos simple y el enlace de datos complejo a orígenes de datos, como conjuntos de datos y tablas de datos. Para obtener información completa sobre el modelo de enlace de datos en los formularios Windows Forms, vea Enlace de datos y formularios Windows Forms.

vínculo a vídeo Para obtener una demostración en vídeo relacionada, vea How Do I: Consume Database Data in Excel?.

Enlace de datos sencillo

El enlace de datos simple existe cuando una propiedad de control está enlazada a un elemento de datos único, como un valor de una tabla de datos. Por ejemplo, el control NamedRange tiene una propiedad Value2 que se puede enlazar a un campo a un conjunto de datos. Cuando cambia el valor del campo del conjunto de datos, cambia el valor del rango con nombre. Todos los controles host, salvo el control XMLNodes, admiten el enlace de datos simple. El control XMLNodes es una colección y por consiguiente no admite el enlace a datos.

Para hacer un enlace de datos simple a un control host, agregue un control Binding a la propiedad DataBindings() del control. Un objeto Binding representa el enlace simple entre un valor de la propiedad del control y el valor de un elemento de datos.

En el ejemplo siguiente se muestra cómo enlazar la propiedad Value2 a un elemento de datos en un proyecto en el nivel del documento. Este ejemplo de código forma parte de un ejemplo más extenso proporcionado para la propiedad DataBindings().

Dim binding1 As New Binding("Value2", ds, "Customers.Names", True)
namedRange1.DataBindings.Add(binding1)
Binding binding1 = new Binding("Value2", ds, "Customers.Names", true);
namedRange1.DataBindings.Add(binding1);

Para ver tutoriales que muestran el enlace de datos simple, vea Tutorial: Enlace de datos simple en un proyecto en el nivel del documento para un proyecto en el nivel del documento y Tutorial: Enlace de datos simple en un proyecto en el nivel de la aplicación para un proyecto en el nivel de la aplicación.

Enlace de datos complejo

El enlace de datos complejo existe cuando una propiedad de un control está enlazada a más de un elemento de datos, como varias columnas de una tabla de datos. El control ListObject para Excel es el único control host que admite el enlace de datos complejo. También hay muchos controles de formularios Windows Forms que admiten el enlace de datos complejo, como el control DataGridView.

Para realizar el enlace de datos complejo, establezca la propiedad DataSource del control en un objeto de origen de datos compatible con el enlace de datos complejo. Por ejemplo, la propiedad DataSource del control ListObject se puede enlazar a varias columnas de una tabla de datos. Todos los datos de la tabla de datos se muestran en el control ListObject y, a medida que cambian los datos de la tabla de datos, también cambia el control ListObject. Para obtener una lista de los orígenes de datos que puede utilizar para el enlace de datos complejo, vea Orígenes de datos compatibles con formularios Windows Forms.

En el ejemplo de código siguiente se crea DataSet con dos objetos DataTable y se rellena con datos una de las tablas. A continuación, se enlaza ListObject a la tabla que contiene los datos. Este ejemplo es para un proyecto en el nivel del documento de Excel.

    Private Sub ListObject_DataSourceAndMember()
        ' Create a DataSet and two DataTables.
        Dim ordersDataSet As New DataSet("ordersDataSet")
        Dim tableCustomers As New DataTable("Customers")
        Dim tableProducts As New DataTable("Products")
        ordersDataSet.Tables.Add(tableCustomers)
        ordersDataSet.Tables.Add(tableProducts)

        ' Add a data to the Customers DataTable.
        tableCustomers.Columns.Add(New DataColumn("LastName"))
        tableCustomers.Columns.Add(New DataColumn("FirstName"))
        Dim dr As DataRow = tableCustomers.NewRow()
        dr("LastName") = "Chan"
        dr("FirstName") = "Gareth"
        tableCustomers.Rows.Add(dr)

        ' Create a list object.
        Dim List1 As Microsoft.Office.Tools.Excel.ListObject = _
            Me.Controls.AddListObject(Me.Range( _
            "A1"), "Customers")

        ' Bind the list object to the Customers table.
        List1.AutoSetDataBoundColumnHeaders = True
        List1.DataSource = ordersDataSet
        List1.DataMember = "Customers"

    End Sub

private void ListObject_DataSourceAndMember()
{
    // Create a DataSet and two DataTables.
    DataSet ordersDataSet = new DataSet("ordersDataSet");
    DataTable tableCustomers = new DataTable("Customers");
    DataTable tableProducts = new DataTable("Products");
    ordersDataSet.Tables.Add(tableCustomers);
    ordersDataSet.Tables.Add(tableProducts);

    // Add a data to the Customers DataTable.
    tableCustomers.Columns.Add(new DataColumn("LastName"));
    tableCustomers.Columns.Add(new DataColumn("FirstName"));
    DataRow dr = tableCustomers.NewRow();
    dr["LastName"] = "Chan";
    dr["FirstName"] = "Gareth";
    tableCustomers.Rows.Add(dr);

    // Create a list object.
    Microsoft.Office.Tools.Excel.ListObject list1 = 
        this.Controls.AddListObject(
        this.Range["A1", missing], "Customers");

    // Bind the list object to the Customers table.
    list1.AutoSetDataBoundColumnHeaders = true;
    list1.DataSource = ordersDataSet;
    list1.DataMember = "Customers";
}

Para ver tutoriales que muestran el enlace de datos complejo, vea Tutorial: Enlace de datos complejo en un proyecto en el nivel del documento para un proyecto en el nivel del documento y Tutorial: Enlace de datos complejo en un proyecto en el nivel de la aplicación para un proyecto en el nivel de la aplicación.

Mostrar datos en documentos y libros

En proyectos en el nivel del documento, puede utilizar la ventana Orígenes de datos para agregar fácilmente controles enlazados a datos a los documentos o a los libros, de la misma forma que se utiliza en los formularios Windows Forms. Para obtener más información sobre el uso de la ventana Orígenes de datos, vea Enlazar controles de Windows Forms a datos en Visual Studio y Orígenes de datos (ventana).

Arrastrar los controles de la ventana Orígenes de datos

Se crea un control en el documento cuando se arrastra un objeto desde la ventana Orígenes de datos. El tipo de control que se crea depende de si se enlaza a una columna única o a varias columnas de datos.

Para Excel, en la hoja de cálculo se crea un control NamedRange para cada campo y un control ListObject para cada rango de datos que incluye varias filas y columnas. Puede cambiar este valor predeterminado si selecciona la tabla o el campo en la ventana Orígenes de datos y después elegir un control diferente en la lista desplegable.

Se agrega un control ContentControl a los documentos. El tipo de control de contenido depende del tipo de datos del campo que haya seleccionado.

Enlazar datos en proyectos en el nivel del documento en tiempo de diseño

En los temas siguientes se muestran ejemplos de enlace de datos en tiempo de diseño:

Enlazar datos en proyectos en el nivel de la aplicación

En los proyectos en el nivel de la aplicación, únicamente se pueden agregar controles en tiempo de ejecución. En los temas siguientes se muestran ejemplos de enlace de datos en tiempo de ejecución:

Actualizar datos enlazados a controles host

El enlace de datos entre un origen de datos y un control host implica una actualización de datos bidireccional. En el enlace de datos simple, los cambios en el origen de datos se reflejan automáticamente en el control host, pero los cambios en el control host requieren una llamada explícita para actualizar el origen de datos. Esto se debe a que, en algunos casos, los cambios en un campo enlazado a datos no se aceptan si no van acompañados de cambios en otro campo enlazado a datos. Por ejemplo, se podrían tener dos campos, uno para la edad y otro para años de experiencia. La experiencia no puede ser mayor que la edad. Un usuario no puede actualizar la edad de 50 a 25 y, a continuación, la experiencia de 30 a 10 a menos que realice los cambios al mismo tiempo. Para resolver este problema, los campos con enlace de datos simple no se actualizan hasta que las actualizaciones se envían explícitamente mediante código.

Para actualizar un origen de datos de los controles host que habilitan el enlace de datos simple, debe enviar las actualizaciones al origen de datos en memoria (como un DataSet o DataTable) y a la base de datos back-end, si la solución utiliza una.

No necesita actualizar explícitamente el origen de datos en memoria al hacer el enlace a datos complejo utilizando el control ListObject. En este caso, los cambios se envían automáticamente al origen de datos en memoria sin necesidad de código adicional.

Para obtener más información, vea Cómo: Actualizar un origen de datos con datos de un control Host.

Vea también

Tareas

Cómo: Crear un control con enlace simple en un formulario Windows Forms

Cómo: Actualizar datos utilizando un TableAdapter

Conceptos

Enlace de datos y formularios Windows Forms

Enlazar controles de Windows Forms a datos en Visual Studio

Guardar los datos en conjuntos de datos

Almacenar datos en caché

Otros recursos

How Do I: Consume Database Data in Excel?

Control de simultaneidad en ADO.NET

Datos en las soluciones de Office