逐步解說:將數據系結至 Word 動作窗格上的控件

本逐步解說示範 Word 中動作窗格上控件的數據系結。 這些控制項會顯示 SQL Server 資料庫中資料表之間的主要/詳細資料關聯。

適用於: 本主題中的資訊適用於 Word 的檔案層級專案。 如需詳細資訊,請參閱 Office 應用程式 lication 和項目類型所提供的功能。

本逐步解說將說明下列工作:

  • 使用系結至數據的 Windows Forms 控件建立執行窗格。

  • 使用主要/詳細數據關聯性在控件中顯示數據。

  • 當應用程式開啟時,顯示 [動作] 窗格。

注意

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

必要條件

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

  • 此版 Visual Studio 包含 Microsoft Office Developer Tools。 如需詳細資訊,請參閱 設定計算機來開發 Office 解決方案

  • Word 2013 或 Word 2010 。

  • 使用 Northwind SQL Server 範例數據庫存取伺服器。

  • 讀取和寫入 SQL Server 資料庫的許可權。

建立專案

第一個步驟是建立 Windows 文件專案。

建立新的專案

  1. 建立名稱 為 [我的 Word 動作窗格] 的 Word 檔案專案。 在精靈中,選取 [ 建立新檔]。

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

    Visual Studio 會在設計工具中開啟新的 Word 檔,並將 [我的 Word 動作窗格] 專案新增方案總管

將控件新增至執行窗格

在本逐步解說中,您需要包含數據系結 Windows Forms 控件的動作窗格控制件。 將數據源新增至專案,然後將控件從 [數據源 ] 視窗拖曳至 [動作] 窗格控件。

若要新增執行窗格控件

  1. 在 方案總管選取 [我的 Word 動作窗格] 專案。

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

  3. 在 [ 新增專案 ] 對話框中,選取 [ 動作窗格控件],將它命名為 ActionsControl,然後按兩下 [ 新增]。

將數據源新增至專案

  1. 如果看不到 [數據源] 視窗,請在功能表欄上選擇 [檢視>其他 Windows>數據源] 來顯示它。

    注意

    如果 [顯示數據源 ] 無法使用,請按兩下 Word 檔,然後再檢查一次。

  2. 按兩下 [新增資料源 ] 以啟動 [資料源設定精靈]。

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

  4. 選取 Northwind 範例 SQL Server 資料庫的數據連線,或使用 [新增 連線 ion] 按鈕新增連線。

  5. 按一下 [下一步] 。

  6. 清除選取連線時儲存連線的選項,然後按 [ 下一步]

  7. 展開 [資料庫物件] 視窗中的 [數據表] 節點。

  8. 選取 [供應商產品] 資料表旁的複選框。

  9. 按一下完成

    精靈會將 供應商 數據表和 Products 資料表新增至 [資料源] 視窗。 它也會將具型別數據集新增至專案中,方案總管 中可見。

若要將數據系結的 Windows Forms 控件新增至執行窗格控件

  1. 在 [ 數據源] 視窗中,展開 [供貨商 ] 數據表。

  2. 按兩下 [公司名稱] 節點上的下拉式箭號,然後選取 [ComboBox]。

  3. 將 CompanyName[資料源] 視窗拖曳至 [動作] 窗格控制件。

    控制件 ComboBox 會在執行窗格控制件上建立。 同時,名為SuppliersBindingSourceBindingSource 、數據表配接器,以及 DataSet 會新增至元件匣中的專案。

  4. 在 [元件匣] 中選取 SuppliersBindingNavigator ,然後按 [刪除]。 在本逐步解說中,您將不會使用 SuppliersBindingNavigator

    注意

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

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

  6. 在 [數據源] 視窗中,展開 [Products] 數據表,這是供應商數據表的子系。

  7. 單擊 ProductName 節點上的下拉式箭號,然後選取 [ListBox]。

  8. 將 ProductName 拖曳至執行窗格控件。

    控制件 ListBox 會在執行窗格控制件上建立。 同時, BindingSource 具名 ProductBindingSource 和數據表配接器會新增至元件匣中的專案。

  9. 移動清單框,使其位於標籤底下,並將 Size 屬性變更171,95

  10. Button將 從 [工具箱] 拖曳到執行窗格控件,並將它放在清單框下方。

  11. 以滑鼠右鍵按兩下 Button,按下 捷徑選單上的 [屬性 ],然後變更下列屬性。

    屬性
    名稱 插入
    Text 插入
  12. 調整使用者控制元件的大小以符合控制件。

設定數據源

若要設定數據源,請將程式代碼新增至 Load 執行窗格控件的事件,以填入控件 DataTable中的數據,並設定每個控件的 DataSourceDataMember 屬性。

使用數據載入控制件

  1. Load 類別的事件處理程式中 ActionsControl ,新增下列程序代碼。

    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程式代碼放在建構函式中。 如需如何建立事件處理程式的詳細資訊,請參閱 如何:在 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 屬性右邊的按鈕,然後選取 []。

新增方法以將數據插入數據表

下一項工作是從綁定控件讀取數據,並在 Word 檔中填入數據表。 首先,建立程式來格式化表格中的標題,然後新增 AddData 方法來建立及格式化 Word 表格。

格式化表格標題

  1. 在類別中 ActionsControl ,建立方法以格式化數據表的標題。

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

若要建立數據表

  1. 在類別中 ActionsControl ,撰寫方法,如果數據表不存在,則會建立數據表,並將動作窗格中的數據新增至數據表。

    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 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 按鈕的事件建立事件處理程式。 您可以將此程式代碼放在 Load 類別的事件處理程式中 ActionsControl

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

顯示執行窗格

將控件加入其中之後,動作窗格就會變成可見。

顯示執行窗格

  1. 方案總管 中,以滑鼠右鍵按兩下 ThisDocument.vbThisDocument.cs,然後按下快捷方式選單上的 [檢視程式代碼]。

  2. 在 類別頂端 ThisDocument 建立 控件的新實例,使其看起來像下列範例。

    private ActionsControl actions = new ActionsControl();
    
  3. 將程式代碼新增至 的 Startup 事件處理程式 ThisDocument ,使其看起來像下列範例。

    this.ActionsPane.Controls.Add(actions);
    

測試應用程式

現在,您可以測試您的文件,確認開啟檔時會出現執行窗格。 在動作窗格的控件中測試主要/詳細數據關聯性,並確定按兩下 [插入] 按鈕時,會在 Word 資料表中填入數據。

測試文件

  1. F5 執行您的專案。

  2. 確認 [動作] 窗格可見。

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

  4. 選取產品,按兩下 [動作] 窗格上的 [ 插入 ],並確認產品詳細數據已新增至 Word 中的數據表。

  5. 插入來自各種公司的其他產品。

下一步

本逐步解說說明將數據系結至 Word 中動作窗格上控件的基本概念。 接著可以執行下列一些工作: