逐步解說:在運行時間更新功能區上的控制件

本逐步解說示範如何在功能區載入至 Office 應用程式 數據列之後,使用功能區物件模型來更新功能區上的控件。

適用於: 本主題中的資訊適用於下列應用程式的檔層級專案和 VSTO 載入宏專案:Excel;InfoPath 2013 和 InfoPath 2010;前景;幻燈片;專案;Visio;詞。 如需詳細資訊,請參閱 Office 應用程式 lication 和項目類型所提供的功能。

此範例會提取 Northwind 範例資料庫的資料,填入 Microsoft Office Outlook 中的下拉式方塊和功能表。 您在這些控制件中選取的項目會自動填入電子郵件訊息中的 [收件者] 和 [主旨] 等字段。

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

  • 建立新的 Outlook VSTO 載入宏專案。

  • 設計自定義功能區群組。

  • 將自定義群組新增至內建索引標籤。

  • 在運行時間更新功能區上的控制件。

注意

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

必要條件

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

建立新的 Outlook VSTO 載入宏專案

首先,建立 Outlook VSTO 增益集專案。

建立新的 Outlook VSTO 增益集專案

  1. 在 Visual Studio 中,使用名稱 Ribbon_Update_At_Runtime建立 Outlook VSTO 載入宏專案。

  2. 在 [新增專案] 對話方塊中,選取 [為方案建立目錄]

  3. 將專案儲存至預設的專案目錄。

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

設計自定義功能區群組

當使用者撰寫新郵件訊息時,就會顯示此範例的功能區。 若要建立功能區的自定義群組,請先將功能區專案新增至專案,然後在功能區設計工具中設計群組。 此自定義群組可協助您從資料庫提取名稱和訂單歷程記錄,以產生客戶的後續電子郵件訊息。

設計自訂群組

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

  2. 選取 [ 加入新項目 ] 對話方塊中的 [ 功能區 (視覺化設計工具)]。

  3. 將新功能區的名稱變更為 CustomerRibbon,然後按兩下 [ 新增]。

    CustomerRibbon.csCustomerRibbon.vb 檔案會在功能區設計工具中開啟,並顯示預設的索引卷標和群組。

  4. 按一下選取功能區設計工具。

  5. 在 [屬性] 視窗中,按兩下RibbonType屬性旁的下拉式箭號,然後按兩下 [Microsoft.Outlook.Mail.Compose]。

    這可讓使用者在 Outlook 中撰寫新郵件訊息時顯示功能區。

  6. 在功能區設計工具中,按兩下 [Group1 ] 加以選取。

  7. 在 [屬性] 視窗中,將 [卷標] 設定為 [客戶購買]。

  8. 從 [工具箱] 的 [Office 功能區控件] 索引卷標,將 ComboBox 拖曳[客戶購買] 群組。

  9. 按兩下 [ComboBox1] 加以選取。

  10. 在 [屬性] 視窗中,將 [卷標] 設定為 [客戶]。

  11. 從 [工具箱] 的 [Office 功能區控件] 索引卷標,將功能表拖曳[客戶購買] 群組。

  12. 在 [屬性] 視窗中,將 [卷標] 設定為 [已購買的產品]。

  13. 將 [動態] 設定true

    這可讓您在功能區載入至 Office 應用程式 數據列之後,於運行時間在功能表上新增和移除控制件。

將自定義群組新增至內建索引標籤

內建索引標籤是已在 Outlook 檔案總管或 Inspector 功能區上的索引標籤。 在這個程序中,您要將自訂群組加入內建索引標籤,然後指定自訂群組在索引標籤上的位置。

將自訂群組加入內建索引標籤

  1. 按兩下 [ TabAddins (內建] 索引標籤以選取它。

  2. 在 [屬性] 視窗中,展開 ControlId 屬性,然後將 OfficeId 設定TabNewMailMessage

    這會將 [客戶購買] 群組新增出現在新郵件訊息中功能區的 [訊息] 索引卷標。

  3. 按兩下 [ 客戶購買] 群組以選取它。

  4. 在 [屬性] 視窗中,展開 [位置] 屬性,按兩下 PositionType 屬性旁邊的下拉式箭號,然後按兩下 BeforeOfficeId

  5. OfficeId 屬性設定為 GroupClipboard

    這會將客戶購買群組放在 [訊息] 索引標籤的 [剪貼簿] 群組之前

建立資料來源

使用 [ 資料來源 ] 視窗將型別資料集加入專案。

若要建立資料來源

  1. 在 [ 資料 ] 功能表上,請按一下 [ 加入新資料來源]。

    這會啟動 [數據源組態精靈]。

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

  3. 選取 [ 數據集],然後按 [ 下一步]。

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

  5. 選取或建立連線之後,按 [ 下一步]。

  6. [下一步] 儲存 連接字串。

  7. 在 [ 選擇資料庫物件] 頁面上,展開 [數據表]。

  8. 選取下列每個資料表旁的核取方塊:

    1. 客戶

    2. 訂單詳細數據

    3. 訂單

    4. 產品

  9. 按一下完成

在運行時間更新自定義群組中的控制件

使用功能區物件模型執行下列工作:

  • 將客戶名稱新增至 [客戶 ] 下拉式方塊。

  • 將功能表和按鈕控件新增至 [已購買 的產品] 功能表,代表銷售訂單和銷售的產品。

  • 使用 [客戶] 下拉式方塊和 [已購買的產品] 功能表的數據,填入新郵件訊息的 [收件者]、[主旨] 和 [內文] 字段。

使用功能區物件模型更新自訂群組中的控制項

  1. 在 [專案] 功能表上,按一下 [加入參考]。

  2. 在 [ 新增參考 ] 對話框中,按兩下 [.NET ] 索引標籤,選取 System.Data.Linq 元件,然後按兩下 [ 確定]。

    這個組件包含使用 Language-Integrated Queries (LINQ) 的類別。 您會使用 LINQ,以 Northwind 資料庫的資料填入自訂群組中的控制項。

  3. 方案總管 中,按兩下 [CustomerRibbon.cs] 或 [CustomerRibbon.vb] 加以選取。

  4. 在 [檢視] 功能表中,按一下 [程式碼]

    功能區程式碼檔案隨即在程式碼編輯器中開啟。

  5. 在功能區程式碼檔的頂端加入下列陳述式。 這些陳述式可讓您輕鬆存取 LINQ 命名空間和 Outlook 主要 interop 組件 (PIA) 的命名空間。

    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Linq.Expressions;
    using Outlook = Microsoft.Office.Interop.Outlook;
    using System.Data;
    using System.IO;
    using Ribbon_Update_At_Runtime.Northwind40DataSetTableAdapters;
    
  6. 在類別內 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();
    
  7. 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;
    }
    
  8. 以下列程式碼取代 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();
      }
      

  9. 將下列程式碼加入 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);
              }
          }
      }
      

  10. 方案總管 中,按兩下功能區程式代碼檔案。

    螢幕設計工具隨即開啟。

  11. 在功能區設計工具中,按兩下拉式方塊。

    功能區程式碼檔案會在程式碼編輯器中開啟,且 ComboBox1_TextChanged 事件處理常式隨即出現。

  12. 以下列程式碼取代 ComboBox1_TextChanged 事件處理常式。 這個程式碼會執行下列工作:

    • 呼叫 PopulateSalesOrderInfo helper 方法。 此方法會 使用與所選客戶相關的銷售訂單來更新 [已購買 的產品] 功能表。

    • 呼叫 PopulateMailItem helper 方法,並在目前的文字,也就是選取的客戶名稱中傳遞。 這個方法會填入新郵件訊息的 [收件者]、[主旨] 和 [內文] 字段。

      private void comboBox1_TextChanged(object sender,
          RibbonControlEventArgs e)
      {
          PopulateSalesOrderInfo();
          PopulateMailItem(comboBox1.Text);
      }
      

  13. 將下列 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;
    }
    
  14. 將下列程式碼加入 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 資料庫中的數據更新。

測試自訂群組中的控制項

  1. F5 執行您的專案。

    Outlook 啟動。

  2. 在 Outlook 的 [ 檔案 ] 選單上,指向 [ 新增],然後按兩下 [ 郵件訊息]。

    會出現下列動作:

    • 新的郵件偵測器視窗出現。

    • 在功能區的 [訊息] 索引標籤上,[客戶購買] 群組會出現在 [剪貼簿] 群組之前。

    • 群組 中的 [客戶 ] 下拉式方塊會以 Northwind 資料庫中的客戶名稱更新。

  3. 在功能區的 [訊息] 索引標籤的 [客戶購買] 群組中,從 [客戶] 下拉式方塊中選取客戶。

    會出現下列動作:

    • [ 已購買 的產品] 功能表會更新,以顯示所選客戶的每個銷售訂單。

    • 每個銷售訂單的子功能表都會更新以顯示該訂單中購買的產品。

    • 選取的客戶電子郵件位址會新增至 郵件訊息的 [收 件者] 行,郵件訊息的主旨和本文會填入文字。

  4. 單擊 [ 產品購買 ] 功能表,指向任何銷售訂單,然後單擊銷售訂單中的產品。

    產品名稱會加入郵件的本文。

下一步

您可以透過下列主題,進一步了解自訂 Office UI 的方式: