Tutorial: Enlazar datos a controles en un recuadro de acciones de Word

En este tutorial se muestra cómo enlazar datos a los controles en un panel de acciones de Microsoft Office Word. Los controles muestran una relación principal-detalle entre las tablas de una base de datos de SQL Server.

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

En este tutorial se muestran las tareas siguientes:

  • Crear un panel de acciones con controles de formularios Windows Forms enlazados a datos.

  • Utilizar una relación principal-detalle para mostrar datos en los controles.

  • Mostrar el panel de acciones cuando se abre la aplicación.

Nota

Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que tenga y la configuración que esté utilizando determinan estos elementos. Para obtener más información, vea Trabajar con valores de configuración.

Requisitos previos

Necesita los componentes siguientes para completar este tutorial:

-

Una edición de Visual Studio 2010 que incluye las herramientas para desarrolladores de Microsoft Office. Para obtener más información, vea [Configurar un equipo para desarrollar soluciones de Office](bb398242\(v=vs.100\).md).
  • Word 2007 o Word 2010.

  • Acceso a un servidor con la base de datos de ejemplo Northwind de SQL Server.

  • Permisos de lectura y escritura en la base de datos de SQL Server.

Crear el proyecto

El primer paso es crear el proyecto de documento de Word.

Para crear un nuevo proyecto

  • Cree un proyecto de documento de Word con el nombre Mi panel de acciones de Word. En el asistente, seleccione Crear un nuevo documento.

    Para obtener más información, vea Cómo: Crear proyectos de Office en Visual Studio.

    Visual Studio abre el nuevo documento de Word en el diseñador y agrega el proyecto Mi panel de acciones de Word al Explorador de soluciones.

Agregar controles al panel de acciones

Para este tutorial, necesitará un control del panel de acciones que contenga controles de formularios Windows Forms enlazados a datos. Agregue un origen de datos al proyecto y, a continuación, arrastre los controles de la ventana Orígenes de datos al control del panel de acciones.

Para agregar un control del panel de acciones

  1. Seleccione el proyecto Mi panel de acciones de Word en el Explorador de soluciones.

  2. En el menú Proyecto, haga clic en Agregar nuevo elemento.

  3. En el cuadro de diálogo Agregar nuevo elemento, seleccione Control del panel de acciones, asígnele el nombre ActionsControl y, a continuación, haga clic en Agregar.

Para agregar un nuevo origen de datos al proyecto

  1. Si la ventana Orígenes de datos no está visible, haga clic en Mostrar orígenes de datos en el menú Datos.

    Nota

    Si la opción Mostrar orígenes de datos no está disponible, haga clic en el documento de Word y compruébelo de nuevo.

  2. Haga clic en Agregar nuevo origen de datos para iniciar el Asistente para configuración de orígenes de datos.

  3. Seleccione Base de datos y, a continuación, haga clic en Siguiente.

  4. Seleccione una conexión de datos a la base de datos de ejemplo Northwind de SQL Server o agregue una nueva conexión mediante el botón Nueva conexión.

  5. Haga clic en Siguiente.

  6. Si estuviera activada, desactive la opción de guardar la conexión y, a continuación, haga clic en Siguiente.

  7. Expanda el nodo Tablas en la ventana Objetos de base de datos.

  8. Active la casilla situada junto a las tablas Suppliers y Products.

  9. Haga clic en Finalizar.

El asistente agrega las tablas Suppliers y Products a la ventana Orígenes de datos. También agrega al proyecto un conjunto de datos con tipo, visible en el Explorador de soluciones.

Para agregar controles de formularios Windows Forms enlazados a datos a un control del panel de acciones

  1. En la ventana Orígenes de datos, expanda la tabla Suppliers.

  2. Haga clic en la flecha de lista desplegable en el nodo Company Name y seleccione ComboBox.

  3. Arrastre CompanyName desde la ventana Orígenes de datos al control del panel de acciones.

    A continuación, se creará un control ComboBox en el control del panel de acciones. Al mismo tiempo se agregarán al proyecto, en la bandeja de componentes, un control BindingSource denominado SuppliersBindingSource, un adaptador de tablas y una clase DataSet.

  4. Seleccione SuppliersBindingNavigator en la bandeja de componentes y presione SUPRIMIR. No utilizará SuppliersBindingNavigator en este tutorial.

    Nota

    Al eliminar SuppliersBindingNavigator, no se elimina todo el código generado para él. Puede quitar este código.

  5. Mueva el cuadro combinado hasta que se encuentre bajo la etiqueta y cambie la propiedad Size a 171, 21.

  6. En la ventana Orígenes de datos, expanda la tabla Products que es secundaria de la tabla Suppliers.

  7. Haga clic en la flecha de lista desplegable en el nodo ProductName y seleccione ListBox.

  8. Arrastre ProductName al control del panel de acciones.

    A continuación, se creará un control ListBox en el control del panel de acciones. Al mismo tiempo se agregarán al proyecto, en la bandeja de componentes, un control BindingSource denominado ProductBindingSource y un adaptador de tablas.

  9. Mueva el cuadro de lista hasta que se encuentre bajo la etiqueta y cambie la propiedad Size a 171,95.

  10. Arrastre el control Button desde el Cuadro de herramientas al control del panel de acciones y colóquelo debajo del cuadro de lista.

  11. Haga clic con el botón secundario en el control Button, haga clic en Propiedades, en el menú contextual, y cambie las siguientes propiedades.

    Propiedad

    Valor

    Name

    Insertar

    Text

    Insertar

  12. Cambie el tamaño del control de usuario para ajustar los controles.

Configurar el origen de datos

Para configurar el origen de datos, agregue código al evento Load del control del panel de acciones para rellenar el control con datos de la clase DataTable y establezca las propiedades DataSource y DataMember para cada control.

Para cargar el control con datos

  1. En el controlador de eventos Load de la clase ActionsControl, agregue el siguiente código.

    Private Sub ActionsControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
    
        Me.SuppliersTableAdapter.Fill(Me.NorthwindDataSet.Suppliers)
        Me.ProductsTableAdapter.Fill(Me.NorthwindDataSet.Products)
    End Sub
    
    private void ActionsControl_Load(object sender, EventArgs e)
    {
        this.suppliersTableAdapter.Fill(this.northwindDataSet.Suppliers);
        this.productsTableAdapter.Fill(this.northwindDataSet.Products);
    }
    
  2. En C#, debe asociar el controlador de eventos al evento Load. Puede colocar este código en el constructor ActionsControl, después de la llamada a InitializeComponent. Para obtener más información acerca de cómo crear controladores de eventos, vea Cómo: Crear controladores de eventos en proyectos de Office.

    this.Load += new EventHandler(ActionsControl_Load);
    

Para establecer las propiedades de enlace de datos de los controles

  1. Seleccione el control CompanyNameComboBox.

  2. En la ventana Propiedades, haga clic en el botón situado a la derecha de la propiedad DataSource y seleccione suppliersBindingSource.

  3. Haga clic en el botón situado a la derecha de la propiedad DisplayMember y seleccione CompanyName.

  4. Expanda la propiedad DataBindings, haga clic en el botón situado a la derecha de la propiedad Text y seleccione Ninguno.

  5. Seleccione el control ProductNameListBox.

  6. En la ventana Propiedades, haga clic en el botón situado a la derecha de la propiedad DataSource y seleccione productsBindingSource.

  7. Haga clic en el botón situado a la derecha de la propiedad DisplayMember y seleccione ProductName.

  8. Expanda la propiedad DataBindings, haga clic en el botón situado a la derecha de la propiedad SelectedValue y seleccione Ninguno.

Agregar un método para insertar datos en una tabla

La siguiente tarea consiste en leer los datos de los controles enlazados y en rellenar una tabla en el documento de Word. En primer lugar, cree un procedimiento para dar formato a los encabezados de la tabla y, a continuación, agregue el método AddData para crear y dar formato a una tabla de Word.

Para dar formato a los encabezados de la tabla

  • En la clase ActionsControl, cree un método para dar formato a los encabezados de la tabla.

    Shared Sub SetHeadings(ByVal tblCell As Word.Cell, ByVal text As String)
    
        With tblCell.Range
            .Text = text
            .Font.Bold = True
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
        End With
    End Sub
    
    static void SetHeadings(Microsoft.Office.Interop.Word.Cell tblCell, string text)
    {
        tblCell.Range.Text = text;
        tblCell.Range.Font.Bold = 1;
        tblCell.Range.ParagraphFormat.Alignment = 
            Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
    }
    

Para crear la tabla

  • En la clase ActionsControl, escriba un método para crear una tabla si todavía no existe ninguno y agregue los datos del panel de acciones a la tabla.

    Private Sub AddData(ByVal row As System.Data.DataRow, ByVal companyName As String)
    
        ' Create a table if it doesn't already exist.
        If Globals.ThisDocument.Tables.Count = 0 Then
    
            Try
                ' Create a table. 
                Dim tbl As Word.Table = Globals.ThisDocument.Tables.Add( _
                    Globals.ThisDocument.Application.Selection.Range, 1, 4)
    
                ' Insert headings.
                SetHeadings(tbl.Cell(1, 1), "Company Name")
                SetHeadings(tbl.Cell(1, 2), "Product Name")
                SetHeadings(tbl.Cell(1, 3), "Quantity")
                SetHeadings(tbl.Cell(1, 4), "Unit Price")
    
            Catch ex As Exception
                MessageBox.Show("Problem creating Products table: " & ex.Message, _
                    "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    
        ' Add data from data row to the table.
        Dim selection As Word.Selection = Globals.ThisDocument.Application.Selection
    
        If selection.Tables.Count > 0 Then
    
            Dim newRow As Word.Row = Globals.ThisDocument.Tables(1).Rows.Add()
            With newRow
                .Range.Font.Bold = False
                .Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
                .Cells(4).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight
                .Cells(1).Range.Text = companyName
                .Cells(2).Range.Text = row.Item("ProductName").ToString
                .Cells(3).Range.Text = row.Item("QuantityPerUnit").ToString
                .Cells(4).Range.Text = Math.Round(row.Item("UnitPrice"), 2)
            End With
    
        Else
            MessageBox.Show("Cursor must be within a table.", _
                "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub
    
    private void AddData(System.Data.DataRow row, string companyName)
    {
        object missing = System.Type.Missing;
    
        // Create a table if it doesn't already exist.
        if (Globals.ThisDocument.Tables.Count == 0)
        {
            try
            {
                // Create a table.
                Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add
                    (Globals.ThisDocument.Application.Selection.Range, 1, 4, ref missing, ref missing);
    
                // Insert headings.
                SetHeadings(tbl.Cell(1, 1), "Company Name");
                SetHeadings(tbl.Cell(1, 2), "Product Name");
                SetHeadings(tbl.Cell(1, 3), "Quantity");
                SetHeadings(tbl.Cell(1, 4), "Unit Price");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problem creating Products table: " + ex.Message, 
                    "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    
        // Add data from data row to the table.
        Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection;
    
        if (selection.Tables.Count > 0)
        {
            Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1].Rows.Add(ref missing);
    
            newRow.Range.Font.Bold = 0;
    
            newRow.Range.ParagraphFormat.Alignment = 
                Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft;
    
            newRow.Cells[4].Range.ParagraphFormat.Alignment =
                Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight;
    
            newRow.Cells[1].Range.Text = companyName;
            newRow.Cells[2].Range.Text = row["ProductName"].ToString();
            newRow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString();
            newRow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString("#,##0.00");
        }
        else
        {
            MessageBox.Show("Cursor must be within a table.", 
                "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    

Para insertar texto en una tabla de Word

  1. Agregue el siguiente código al controlador de eventos Click del botón Insert.

    Private Sub Insert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Insert.Click
    
        Dim tbl As System.Data.DataTable = NorthwindDataSet.Products
        Dim rows() As System.Data.DataRow
    
        ' Check if a product is selected.
        If Not Me.ProductNameListBox.SelectedIndex < 0 Then
    
            Dim product As String = Me.ProductNameListBox.SelectedItem.Row.Item("ProductName")
            Dim company As String = Me.CompanyNameComboBox.Text
    
            ' Return the data row from the selected Product in the list box.
            rows = tbl.Select("[ProductName] = '" & product.Replace("'", "''") & "'")
    
            AddData(rows(0), company)
    
        Else
            MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK)
        End If
    End Sub
    
    private void Insert_Click(object sender, System.EventArgs e)
    {
        System.Data.DataTable tbl = northwindDataSet.Products;
        System.Data.DataRow[] rows;
    
        // Check if a product is selected.
        if (this.productNameListBox.SelectedIndex >= 0)
        {
            System.Data.DataRowView productRow = (System.Data.DataRowView)this.productNameListBox.SelectedItem;
    
            string product = productRow.Row["ProductName"].ToString();
            string company = this.companyNameComboBox.Text;
    
            // Return the data row from the selected product.
            rows = tbl.Select("[ProductName] = '" + product.Replace("'", "''") + "'");
    
            this.AddData(rows[0], company);
        }
        else
        {
            MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK);
        }
    }
    
  2. En C#, debe crear un controlador de eventos para el evento Click del botón. Puede colocar este código en el controlador de eventos Load de la clase ActionsControl.

    this.Insert.Click += new EventHandler(Insert_Click);
    

Mostrar el panel de acciones

El panel de acciones se hace visible tras agregarle los controles.

Para mostrar el panel de acciones

  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en ThisDocument.vb o ThisDocument.cs y, a continuación, haga clic en Ver código en el menú contextual.

  2. Cree una nueva instancia del control en la parte superior de la clase ThisDocument de modo que tenga un aspecto similar al del ejemplo siguiente.

    Dim actions As New ActionsControl
    
    private ActionsControl actions = new ActionsControl();
    
  3. Agregue código al controlador de eventos Startup de ThisDocument de modo que tenga un aspecto similar al del ejemplo siguiente.

    Me.ActionsPane.Controls.Add(actions)
    
    this.ActionsPane.Controls.Add(actions);
    

Probar la aplicación

Ahora puede probar su documento para comprobar que el panel de acciones aparece cuando se abre el documento. Pruebe la relación principal-detalle en los controles del panel de acciones y asegúrese de que, al hacer clic en el botón Insertar, se rellenan los datos de una tabla de Word.

Para probar el documento

  1. Presione F5 para ejecutar el proyecto.

  2. Confirme que el panel de acciones es visible.

  3. Seleccione una compañía en el cuadro combinado y compruebe que cambian los elementos del cuadro de lista Products.

  4. Seleccione un producto, haga clic en Insertar en el panel de acciones y compruebe que los detalles del producto se agregan a la tabla de Word.

  5. Inserte otros productos de las distintas compañías.

Pasos siguientes

En este tutorial se muestran los aspectos básicos del enlace de datos a los controles de un panel de acciones en Word. Estas son algunas de las tareas que se pueden realizar a continuación:

Vea también

Tareas

Cómo: Agregar un recuadro de acciones a un documento de Word

Otros recursos

Información general sobre recuadros de acciones

Enlazar datos a controles en soluciones de Office