共用方式為


逐步解說:在 Word 執行窗格將資料繫結至控制項

本逐步解說示範如何將資料繫結至 Microsoft Office Word 執行窗格上的控制項。 控制項示範 SQL Server 資料庫中資料表之間的主從式關聯。

**適用於:**本主題中的資訊適用於 Word 2007 和 Word 2010 的文件層級專案。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能

這個逐步解說將說明下列工作:

  • 建立執行窗格,這個執行窗格包含繫結至資料的 Windows Form 控制項。

  • 使用主從式關聯性顯示控制項中的資料。

  • 在應用程式開啟時顯示執行窗格

注意事項注意事項

在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本和使用的設定決定了這些項目。 如需詳細資訊,請參閱 使用設定

必要條件

您需要下列元件才能完成此逐步解說:

-

包含 Microsoft Office 開發者工具的 Visual Studio 2010 版本。 如需詳細資訊,請參閱[設定電腦以開發 Office 方案](bb398242\(v=vs.100\).md)。
  • Word 2007 或 Word 2010。

  • 與具有 Northwind SQL Server 範例資料庫之伺服器的連線。

  • 從 SQL Server 資料庫讀取及寫入該資料庫的使用權限。

建立專案

第一步就是建立 Word 文件專案。

若要建立新的專案

  • 建立名為 My Word Actions Pane 的 Word 文件專案。 選取精靈中 [建立新文件]。

    如需詳細資訊,請參閱 HOW TO:在 Visual Studio 中建立 Office 專案

    Visual Studio 會在設計工具中開啟新的 Word 文件,並將 [My Word Actions Pane] 專案加入至 [方案總管]。

將控制項加入至執行窗格

對於這個逐步解說,您需要包含資料繫結 Windows Form 控制項的執行窗格控制項。 將資料來源加入至專案,然後從 [資料來源] 視窗將控制項拖曳至執行窗格控制項。

若要加入執行窗格控制項

  1. 在 [方案總管] 中選取 [My Word Actions Pane] 專案。

  2. 按一下 [專案] 功能表上的 [加入新項目]。

  3. 在 [加入新項目] 對話方塊中,選取 [執行窗格控制項],將其命名為 ActionsControl,然後按一下 [加入]。

若要在專案中加入新資料來源

  1. 如果看不到 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]。

    注意事項注意事項

    如果無法使用 [顯示資料來源],請按一下 Word 文件,然後再檢查一次。

  2. 按一下 [加入新資料來源],啟動 [資料來源組態精靈]。

  3. 選取 [資料庫],再按一下 [下一步]。

  4. 選取與 Northwind 範例 SQL Server 資料庫的資料連接,或使用 [新增連接] 按鈕加入新的連接。

  5. 按一下 [下一步]。

  6. 如果已經選取,請清除儲存連接的選項,然後按一下 [下一步]。

  7. 在 [資料庫物件] 視窗中,展開 [資料表] 節點。

  8. 選取 [供應商] 和 [產品] 資料表旁的核取方塊。

  9. 按一下 [完成]。

精靈會將 [供應商] 資料表和 [產品] 資料表加入至 [資料來源] 視窗, 也會將具型別資料集加入至 [方案總管] 中可以看得到的專案。

若要將資料繫結 Windows Form 控制項加入至執行窗格控制項

  1. 在 [資料來源] 視窗中,展開 [供應商] 資料表。

  2. 按一下 [公司名稱] 節點上的下拉箭號,並選取 [ComboBox]。

  3. 將 [CompanyName] 從 [資料來源] 視窗拖曳至執行窗格控制項。

    在執行窗格控制項上會建立 ComboBox 控制項。 同時,名為 SuppliersBindingSource 的 BindingSource、資料表配接器和 DataSet 會加入至元件匣中的專案。

  4. 選取 [元件] 匣中的 SuppliersBindingNavigator,並按下 DELETE。 在這個逐步解說中,您不會使用 SuppliersBindingNavigator。

    注意事項注意事項

    刪除 SuppliersBindingNavigator 並不會移除為其產生的所有程式碼。 您可以移除此程式碼。

  5. 移動下拉式方塊,使其位於標籤底下,並將 [Size] 屬性變更為 171, 21。

  6. 在 [資料來源] 視窗中,展開屬於 [供應商] 資料表子系的 [產品] 資料表。

  7. 按一下 [ProductName] 節點上的下拉箭頭,並選取 [ListBox]。

  8. 將 [ProductName] 拖曳至執行窗格控制項。

    在執行窗格控制項上會建立 ListBox 控制項。 同時,名為 ProductBindingSource 的 BindingSource 和資料表配接器會加入至元件匣中的專案。

  9. 移動清單方塊,使其位於標籤之下,並將 [Size] 屬性變更為 171,95。

  10. Button 從 [工具箱] 拖曳至執行窗格控制項,並將其放置在清單方塊下方。

  11. 以滑鼠右鍵按一下 Button,然後按一下捷徑功能表中的 [屬性],再變更下列屬性。

    屬性

    Name

    Insert

    Text

    插入

  12. 調整使用者控制項 (User Control) 的大小以符合控制項。

設定資料來源

若要設定資料來源,請將程式碼加入至執行窗格控制項的 Load 事件,以用 DataTable 的資料填入控制項,並且設定每個控制項的 DataSourceDataMember 屬性。

若要載入資料至控制項

  1. 在 ActionsControl 類別 (Class) 的 Load 事件處理常式中,加入下列程式碼。

    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. 在 C# 中,您必須將事件處理常式附加至 Load 事件。 您可以在呼叫 InitializeComponent 之後,將此程式碼放在 ActionsControl 建構函式中。 如需如何建立事件處理常式的詳細資訊,請參閱 HOW TO:在 Office 專案中建立事件處理常式

    this.Load += new EventHandler(ActionsControl_Load);
    

若要設定控制項的資料繫結屬性

  1. 選取 CompanyNameComboBox 控制項。

  2. 在 [屬性] 視窗中,按一下 [DataSource] 屬性右邊的按鈕,然後選取 [suppliersBindingSource]。

  3. 按一下 [DisplayMember] 屬性右邊的按鈕,然後選取 [CompanyName]。

  4. 展開 [DataBindings] 屬性,然後按一下 [Text] 屬性右邊的按鈕,再選取 []。

  5. 選取 ProductNameListBox 控制項。

  6. 在 [屬性] 視窗中,按一下 [DataSource] 屬性右邊的按鈕,然後選取 [productsBindingSource]。

  7. 按一下 [DisplayMember] 屬性右邊的按鈕,然後選取 [ProductName]。

  8. 展開 [DataBindings] 屬性,然後按一下 [SelectedValue] 屬性右邊的按鈕,再選取 []。

加入方法以將資料插入資料表

下一個工作是從繫結控制項讀取資料,並用這些資料填入 (Populate) Word 文件中的資料表。 首先,建立將資料表標題格式化的程序,然後加入 AddData 方法以建立和格式化 Word 資料表。

若要格式化資料表標題

  • 在 ActionsControl 類別中,建立格式化資料表標題的方法。

    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;
    }
    

若要建立資料表

  • 在 ActionsControl 類別中,如果資料表不存在時,請撰寫建立資料表的方法,然後將執行窗格中的資料加入至資料表。

    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);
        }
    }
    

若要將文字插入 Word 資料表

  1. 將下列程式碼加入至 [插入] 按鈕的 Click 事件處理常式。

    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. 在 C# 中,您必須為按鈕的 Click 事件建立事件處理常式。 您可以將此程式碼放置在 ActionsControl 類別的 Load 事件處理常式中。

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

顯示執行窗格

在加入控制項後,執行窗格會成為可見。

若要顯示執行窗格

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [ThisDocument.vb] 或 [ThisDocument.cs],然後按一下捷徑功能表上的 [檢視程式碼]。

  2. 在 ThisDocument 類別最上方建立新的控制項執行個體 (Instance),使其看起來如下列範例所示。

    Dim actions As New ActionsControl
    
    private ActionsControl actions = new ActionsControl();
    
  3. 將程式碼加入至 ThisDocument 的 Startup 事件處理常式,使其看起來如下列範例所示。

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

測試應用程式

現在您可以測試文件,確認當文件開啟時,執行窗格也會顯示。 測試執行窗格控制項的主從式關聯,確認當按一下 [插入] 按鈕時,資料會填入 Word 資料表。

若要測試您的文件

  1. 請按 F5 執行您的專案。

  2. 確認可以看見執行窗格。

  3. 在下拉式方塊中選取公司,並且確認 [產品] 清單方塊中項目的變更。

  4. 選取產品,在執行窗格上按一下 [插入],確認產品詳細資料已加入至 Word 中的資料表。

  5. 插入不同的公司其他產品。

後續步驟

這個逐步解說顯示將資料繫結至 Word 中執行窗格上的控制項之基本概念。 以下則是接下來的一些工作:

請參閱

工作

HOW TO:將執行窗格加入至 Word 文件

其他資源

執行窗格概觀

將資料繫結至 Office 方案中的控制項