逐步解說:在運行時間更新功能區上的控制件
本逐步解說示範如何在功能區載入至 Office 應用程式 數據列之後,使用功能區物件模型來更新功能區上的控件。
適用於: 本主題中的資訊適用於下列應用程式的檔層級專案和 VSTO 載入宏專案:Excel;InfoPath 2013 和 InfoPath 2010;前景;幻燈片;專案;Visio;詞。 如需詳細資訊,請參閱 Office 應用程式 lication 和項目類型所提供的功能。
此範例會提取 Northwind 範例資料庫的資料,填入 Microsoft Office Outlook 中的下拉式方塊和功能表。 您在這些控制件中選取的項目會自動填入電子郵件訊息中的 [收件者] 和 [主旨] 等字段。
本逐步解說將說明下列工作:
建立新的 Outlook VSTO 載入宏專案。
設計自定義功能區群組。
將自定義群組新增至內建索引標籤。
在運行時間更新功能區上的控制件。
注意
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。 如需詳細資訊,請參閱將 Visual Studio IDE 個人化。
必要條件
您需要下列元件才能完成這個逐步解說:
此版 Visual Studio 包含 Microsoft Office Developer Tools。 如需詳細資訊,請參閱 設定計算機來開發 Office 解決方案。
Microsoft Outlook
建立新的 Outlook VSTO 載入宏專案
首先,建立 Outlook VSTO 增益集專案。
建立新的 Outlook VSTO 增益集專案
在 Visual Studio 中,使用名稱 Ribbon_Update_At_Runtime建立 Outlook VSTO 載入宏專案。
在 [新增專案] 對話方塊中,選取 [為方案建立目錄] 。
將專案儲存至預設的專案目錄。
如需詳細資訊,請參閱 如何:在Visual Studio中建立 Office專案。
設計自定義功能區群組
當使用者撰寫新郵件訊息時,就會顯示此範例的功能區。 若要建立功能區的自定義群組,請先將功能區專案新增至專案,然後在功能區設計工具中設計群組。 此自定義群組可協助您從資料庫提取名稱和訂單歷程記錄,以產生客戶的後續電子郵件訊息。
設計自訂群組
在 [專案] 功能表上,按一下 [加入新項目]。
選取 [ 加入新項目 ] 對話方塊中的 [ 功能區 (視覺化設計工具)]。
將新功能區的名稱變更為 CustomerRibbon,然後按兩下 [ 新增]。
CustomerRibbon.cs 或 CustomerRibbon.vb 檔案會在功能區設計工具中開啟,並顯示預設的索引卷標和群組。
按一下選取功能區設計工具。
在 [屬性] 視窗中,按兩下RibbonType屬性旁的下拉式箭號,然後按兩下 [Microsoft.Outlook.Mail.Compose]。
這可讓使用者在 Outlook 中撰寫新郵件訊息時顯示功能區。
在功能區設計工具中,按兩下 [Group1 ] 加以選取。
在 [屬性] 視窗中,將 [卷標] 設定為 [客戶購買]。
從 [工具箱] 的 [Office 功能區控件] 索引卷標,將 ComboBox 拖曳到 [客戶購買] 群組。
按兩下 [ComboBox1] 加以選取。
在 [屬性] 視窗中,將 [卷標] 設定為 [客戶]。
從 [工具箱] 的 [Office 功能區控件] 索引卷標,將功能表拖曳到 [客戶購買] 群組。
在 [屬性] 視窗中,將 [卷標] 設定為 [已購買的產品]。
將 [動態] 設定為 true。
這可讓您在功能區載入至 Office 應用程式 數據列之後,於運行時間在功能表上新增和移除控制件。
將自定義群組新增至內建索引標籤
內建索引標籤是已在 Outlook 檔案總管或 Inspector 功能區上的索引標籤。 在這個程序中,您要將自訂群組加入內建索引標籤,然後指定自訂群組在索引標籤上的位置。
將自訂群組加入內建索引標籤
按兩下 [ TabAddins (內建] 索引標籤以選取它。
在 [屬性] 視窗中,展開 ControlId 屬性,然後將 OfficeId 設定為 TabNewMailMessage。
這會將 [客戶購買] 群組新增至出現在新郵件訊息中功能區的 [訊息] 索引卷標。
按兩下 [ 客戶購買] 群組以選取它。
在 [屬性] 視窗中,展開 [位置] 屬性,按兩下 PositionType 屬性旁邊的下拉式箭號,然後按兩下 BeforeOfficeId。
將 OfficeId 屬性設定為 GroupClipboard。
這會將客戶購買群組放在 [訊息] 索引標籤的 [剪貼簿] 群組之前。
建立資料來源
使用 [ 資料來源 ] 視窗將型別資料集加入專案。
若要建立資料來源
在 [ 資料 ] 功能表上,請按一下 [ 加入新資料來源]。
這會啟動 [數據源組態精靈]。
選取 [ 資料庫],然後按 [ 下一步]。
選取 [ 數據集],然後按 [ 下一步]。
選取與 Northwind 範例 Microsoft SQL Server Compact 4.0 資料庫的數據連線,或使用 [新增 連線 ion] 按鈕新增連線。
選取或建立連線之後,按 [ 下一步]。
按 [下一步] 儲存 連接字串。
在 [ 選擇資料庫物件] 頁面上,展開 [數據表]。
選取下列每個資料表旁的核取方塊:
客戶
訂單詳細數據
訂單
產品
按一下完成。
在運行時間更新自定義群組中的控制件
使用功能區物件模型執行下列工作:
將客戶名稱新增至 [客戶 ] 下拉式方塊。
將功能表和按鈕控件新增至 [已購買 的產品] 功能表,代表銷售訂單和銷售的產品。
使用 [客戶] 下拉式方塊和 [已購買的產品] 功能表的數據,填入新郵件訊息的 [收件者]、[主旨] 和 [內文] 字段。
使用功能區物件模型更新自訂群組中的控制項
在 [專案] 功能表上,按一下 [加入參考]。
在 [ 新增參考 ] 對話框中,按兩下 [.NET ] 索引標籤,選取 System.Data.Linq 元件,然後按兩下 [ 確定]。
這個組件包含使用 Language-Integrated Queries (LINQ) 的類別。 您會使用 LINQ,以 Northwind 資料庫的資料填入自訂群組中的控制項。
在 方案總管 中,按兩下 [CustomerRibbon.cs] 或 [CustomerRibbon.vb] 加以選取。
在 [檢視] 功能表中,按一下 [程式碼]。
功能區程式碼檔案隨即在程式碼編輯器中開啟。
在功能區程式碼檔的頂端加入下列陳述式。 這些陳述式可讓您輕鬆存取 LINQ 命名空間和 Outlook 主要 interop 組件 (PIA) 的命名空間。
在類別內
CustomerRibbon
新增下列程序代碼。 這個程式碼會宣告資料表和資料表配接器,您會用它們儲存來自 Northwind 資料庫之客戶、訂單、訂單詳細資料和產品資料表的資訊。//Declare the Northwind dataset. Northwind40DataSet nwDataSet = new Northwind40DataSet(); //Declare the data tables. Northwind40DataSet.CustomersDataTable customerTable; Northwind40DataSet.OrdersDataTable orderTable; Northwind40DataSet.Order_DetailsDataTable orderDetailsTable; Northwind40DataSet.ProductsDataTable productsTable; //Declare the data table adapters for each table. CustomersTableAdapter customerTableAdapter = new CustomersTableAdapter(); OrdersTableAdapter ordersTableAdapter = new OrdersTableAdapter(); Order_DetailsTableAdapter detailsTableAdapter = new Order_DetailsTableAdapter(); ProductsTableAdapter productsTableAdapter = new ProductsTableAdapter();
在
CustomerRibbon
類別中加入下列程式碼區塊。 此程式代碼會新增三個協助程式方法,以在運行時間建立功能區的控件。private RibbonDropDownItem CreateRibbonDropDownItem() { return this.Factory.CreateRibbonDropDownItem(); } private RibbonMenu CreateRibbonMenu() { return this.Factory.CreateRibbonMenu(); } private RibbonButton CreateRibbonButton() { RibbonButton button = this.Factory.CreateRibbonButton(); button.Click += new RibbonControlEventHandler(button_Click); return button; }
以下列程式碼取代
CustomerRibbon_Load
事件處理常式方法。 這個程式碼使用 LINQ 查詢執行下列工作:使用 Northwind 資料庫中 20 個客戶的識別碼和名稱,填入 [客戶 ] 下拉式方塊。
呼叫
PopulateSalesOrderInfo
helper 方法。 此方法會 使用與目前選取的客戶相關的銷售訂單號碼來更新 ProductsPurchased 功能表。private void CustomerRibbon_Load(object sender, RibbonUIEventArgs e) { customerTable = nwDataSet.Customers; customerTableAdapter.Fill(customerTable); var customerQuery = from customers in customerTable.AsEnumerable().Take(20) select new { CustomerID = customers.Field<string>("Customer ID"), CustomerName = customers.Field<string>("Contact Name") }; // Execute the query. foreach (var item in customerQuery) { this.comboBox1.Items.Add(CreateRibbonDropDownItem()); this.comboBox1.Items.Last().Label = item.CustomerName + "|" + item.CustomerID.ToString(); } this.comboBox1.Text = this.comboBox1.Items.First().Label; PopulateSalesOrderInfo(); }
將下列程式碼加入
CustomerRibbon
類別。 這個程式碼使用 LINQ 查詢執行下列工作:針對與所選客戶相關的每個銷售訂單,將子功能表新增至 ProductsPurchased 功能表。
在與銷售訂單相關之產品的每個子功能表加入按鈕。
在每個按鈕加入事件處理常式。
private void PopulateSalesOrderInfo() { String[] tempArray = comboBox1.Text.Split(new Char[] { '|' }); menu1.Items.Clear(); orderTable = nwDataSet.Orders; orderDetailsTable = nwDataSet.Order_Details; productsTable = nwDataSet.Products; ordersTableAdapter.Fill(orderTable); detailsTableAdapter.Fill(orderDetailsTable); productsTableAdapter.Fill(productsTable); var orderQuery = from orders in orderTable.AsEnumerable() where orders.Field<string>("Customer ID") == tempArray[1] select new { OrderID = orders.Field<int>("Order ID") }; foreach (var orderItem in orderQuery) { menu1.Items.Add(CreateRibbonMenu()); RibbonMenu orderMenu = (RibbonMenu)menu1.Items.Last(); orderMenu.Dynamic = true; orderMenu.Label = orderItem.OrderID.ToString(); orderMenu.Tag = orderItem.OrderID; var productQuery = from orderDetail in orderDetailsTable.AsEnumerable() join product in productsTable.AsEnumerable() on orderDetail.Field<int>("Product ID") equals product.Field<int>("Product ID") where orderDetail.Field<int>("Order ID") == orderItem.OrderID select new { ProductName = product.Field<string>("Product Name") }; foreach (var productItem in productQuery) { RibbonButton button = CreateRibbonButton(); button.Label = productItem.ProductName; orderMenu.Items.Add(button); } } }
在 方案總管 中,按兩下功能區程式代碼檔案。
螢幕設計工具隨即開啟。
在功能區設計工具中,按兩下拉式方塊。
功能區程式碼檔案會在程式碼編輯器中開啟,且
ComboBox1_TextChanged
事件處理常式隨即出現。以下列程式碼取代
ComboBox1_TextChanged
事件處理常式。 這個程式碼會執行下列工作:呼叫
PopulateSalesOrderInfo
helper 方法。 此方法會 使用與所選客戶相關的銷售訂單來更新 [已購買 的產品] 功能表。呼叫
PopulateMailItem
helper 方法,並在目前的文字,也就是選取的客戶名稱中傳遞。 這個方法會填入新郵件訊息的 [收件者]、[主旨] 和 [內文] 字段。
將下列
Click
事件處理常式加入CustomerRibbon
類別。 此程式代碼會將所選產品的名稱新增至新郵件訊息的 [內文] 字段。void button_Click(object sender, RibbonControlEventArgs e) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; RibbonButton myCheckBox = (RibbonButton)sender; myMailItem.Subject = "Following up on your order"; myMailItem.Body = myMailItem.Body + "\n" + "* " + myCheckBox.Label; }
將下列程式碼加入
CustomerRibbon
類別。 這個程式碼會執行下列工作:使用目前選取之客戶的電子郵件地址填入新郵件訊息的 [收件者] 行。
將文字新增至新郵件訊息的 [主旨] 和 [內文] 字段。
private void PopulateMailItem(string addressToLine) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; myMailItem.To = ""; String[] tempArray = addressToLine.Split(new Char[] { '|' }); myMailItem.To = tempArray[0] + "@example.com"; myMailItem.Subject = "Following up on your order"; myMailItem.Body = "Hello " + tempArray[0] + "," + "\n" + "We would like to get your feedback on the " + "following products that you recently ordered: "; }
測試自定義群組中的控制件
當您在 Outlook 中開啟新的郵件表單時,功能區的 [郵件] 索引卷標上會出現一個名為 [客戶購買] 的自定義群組。
若要建立客戶後續電子郵件訊息,請選取客戶,然後選取客戶購買的產品。 客戶購買群組中的控件會在運行時間使用 Northwind 資料庫中的數據更新。
測試自訂群組中的控制項
按 F5 執行您的專案。
Outlook 啟動。
在 Outlook 的 [ 檔案 ] 選單上,指向 [ 新增],然後按兩下 [ 郵件訊息]。
會出現下列動作:
新的郵件偵測器視窗出現。
在功能區的 [訊息] 索引標籤上,[客戶購買] 群組會出現在 [剪貼簿] 群組之前。
群組 中的 [客戶 ] 下拉式方塊會以 Northwind 資料庫中的客戶名稱更新。
在功能區的 [訊息] 索引標籤的 [客戶購買] 群組中,從 [客戶] 下拉式方塊中選取客戶。
會出現下列動作:
[ 已購買 的產品] 功能表會更新,以顯示所選客戶的每個銷售訂單。
每個銷售訂單的子功能表都會更新以顯示該訂單中購買的產品。
選取的客戶電子郵件位址會新增至 郵件訊息的 [收 件者] 行,郵件訊息的主旨和本文會填入文字。
單擊 [ 產品購買 ] 功能表,指向任何銷售訂單,然後單擊銷售訂單中的產品。
產品名稱會加入郵件的本文。
下一步
您可以透過下列主題,進一步了解自訂 Office UI 的方式:
將內容為主的 UI 加入至任何文件層級的自訂。 如需詳細資訊,請參閱 動作窗格概觀。
展開標準或自訂的 Microsoft Office Outlook 表單。 如需詳細資訊,請參閱 逐步解說:設計 Outlook 窗體區域。
將自訂工作窗格加入 Outlook。 如需詳細資訊,請參閱 自定義工作窗格。