逐步解說:在 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 控制項的執行窗格控制項。 將資料來源加入至專案,然後從 [資料來源] 視窗將控制項拖曳至執行窗格控制項。
若要加入執行窗格控制項
在 [方案總管] 中選取 [My Word Actions Pane] 專案。
按一下 [專案] 功能表上的 [加入新項目]。
在 [加入新項目] 對話方塊中,選取 [執行窗格控制項],將其命名為 ActionsControl,然後按一下 [加入]。
若要在專案中加入新資料來源
如果看不到 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]。
注意事項 如果無法使用 [顯示資料來源],請按一下 Word 文件,然後再檢查一次。
按一下 [加入新資料來源],啟動 [資料來源組態精靈]。
選取 [資料庫],再按一下 [下一步]。
選取與 Northwind 範例 SQL Server 資料庫的資料連接,或使用 [新增連接] 按鈕加入新的連接。
按一下 [下一步]。
如果已經選取,請清除儲存連接的選項,然後按一下 [下一步]。
在 [資料庫物件] 視窗中,展開 [資料表] 節點。
選取 [供應商] 和 [產品] 資料表旁的核取方塊。
按一下 [完成]。
精靈會將 [供應商] 資料表和 [產品] 資料表加入至 [資料來源] 視窗, 也會將具型別資料集加入至 [方案總管] 中可以看得到的專案。
若要將資料繫結 Windows Form 控制項加入至執行窗格控制項
在 [資料來源] 視窗中,展開 [供應商] 資料表。
按一下 [公司名稱] 節點上的下拉箭號,並選取 [ComboBox]。
將 [CompanyName] 從 [資料來源] 視窗拖曳至執行窗格控制項。
在執行窗格控制項上會建立 ComboBox 控制項。 同時,名為 SuppliersBindingSource 的 BindingSource、資料表配接器和 DataSet 會加入至元件匣中的專案。
選取 [元件] 匣中的 SuppliersBindingNavigator,並按下 DELETE。 在這個逐步解說中,您不會使用 SuppliersBindingNavigator。
注意事項 刪除 SuppliersBindingNavigator 並不會移除為其產生的所有程式碼。 您可以移除此程式碼。
移動下拉式方塊,使其位於標籤底下,並將 [Size] 屬性變更為 171, 21。
在 [資料來源] 視窗中,展開屬於 [供應商] 資料表子系的 [產品] 資料表。
按一下 [ProductName] 節點上的下拉箭頭,並選取 [ListBox]。
將 [ProductName] 拖曳至執行窗格控制項。
在執行窗格控制項上會建立 ListBox 控制項。 同時,名為 ProductBindingSource 的 BindingSource 和資料表配接器會加入至元件匣中的專案。
移動清單方塊,使其位於標籤之下,並將 [Size] 屬性變更為 171,95。
將 Button 從 [工具箱] 拖曳至執行窗格控制項,並將其放置在清單方塊下方。
以滑鼠右鍵按一下 Button,然後按一下捷徑功能表中的 [屬性],再變更下列屬性。
屬性
值
Name
Insert
Text
插入
調整使用者控制項 (User Control) 的大小以符合控制項。
設定資料來源
若要設定資料來源,請將程式碼加入至執行窗格控制項的 Load 事件,以用 DataTable 的資料填入控制項,並且設定每個控制項的 DataSource 和 DataMember 屬性。
若要載入資料至控制項
在 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); }
在 C# 中,您必須將事件處理常式附加至 Load 事件。 您可以在呼叫 InitializeComponent 之後,將此程式碼放在 ActionsControl 建構函式中。 如需如何建立事件處理常式的詳細資訊,請參閱 HOW TO:在 Office 專案中建立事件處理常式。
this.Load += new EventHandler(ActionsControl_Load);
若要設定控制項的資料繫結屬性
選取 CompanyNameComboBox 控制項。
在 [屬性] 視窗中,按一下 [DataSource] 屬性右邊的按鈕,然後選取 [suppliersBindingSource]。
按一下 [DisplayMember] 屬性右邊的按鈕,然後選取 [CompanyName]。
展開 [DataBindings] 屬性,然後按一下 [Text] 屬性右邊的按鈕,再選取 [無]。
選取 ProductNameListBox 控制項。
在 [屬性] 視窗中,按一下 [DataSource] 屬性右邊的按鈕,然後選取 [productsBindingSource]。
按一下 [DisplayMember] 屬性右邊的按鈕,然後選取 [ProductName]。
展開 [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 資料表
將下列程式碼加入至 [插入] 按鈕的 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); } }
在 C# 中,您必須為按鈕的 Click 事件建立事件處理常式。 您可以將此程式碼放置在 ActionsControl 類別的 Load 事件處理常式中。
this.Insert.Click += new EventHandler(Insert_Click);
顯示執行窗格
在加入控制項後,執行窗格會成為可見。
若要顯示執行窗格
在 [方案總管] 中,以滑鼠右鍵按一下 [ThisDocument.vb] 或 [ThisDocument.cs],然後按一下捷徑功能表上的 [檢視程式碼]。
在 ThisDocument 類別最上方建立新的控制項執行個體 (Instance),使其看起來如下列範例所示。
Dim actions As New ActionsControl
private ActionsControl actions = new ActionsControl();
將程式碼加入至 ThisDocument 的 Startup 事件處理常式,使其看起來如下列範例所示。
Me.ActionsPane.Controls.Add(actions)
this.ActionsPane.Controls.Add(actions);
測試應用程式
現在您可以測試文件,確認當文件開啟時,執行窗格也會顯示。 測試執行窗格控制項的主從式關聯,確認當按一下 [插入] 按鈕時,資料會填入 Word 資料表。
若要測試您的文件
請按 F5 執行您的專案。
確認可以看見執行窗格。
在下拉式方塊中選取公司,並且確認 [產品] 清單方塊中項目的變更。
選取產品,在執行窗格上按一下 [插入],確認產品詳細資料已加入至 Word 中的資料表。
插入不同的公司其他產品。
後續步驟
這個逐步解說顯示將資料繫結至 Word 中執行窗格上的控制項之基本概念。 以下則是接下來的一些工作:
將資料繫結至 Excel 中的控制項。 如需詳細資訊,請參閱 逐步解說:將資料繫結至 Excel 執行窗格上的控制項。
顯示和隱藏執行窗格上的控制項。 如需詳細資訊,請參閱 逐步解說:根據使用者內容變更執行窗格。
部署專案。 如需詳細資訊,請參閱 部署概觀 (Visual Studio 中的 Office 程式開發)。