Share via


チュートリアル: 実行時にリボンのコントロールを更新する

このチュートリアルでは、Office アプリケーションにリボンを読み込んだ後に、リボン オブジェクト モデルを使用してリボン上のコントロールを更新する方法について説明します。

適用対象: このトピックの情報は、Excel、InfoPath 2013 と InfoPath 2010、Outlook、PowerPoint、Project、Visio、Word のアプリケーションのドキュメント レベルのプロジェクトおよび VSTO アドイン プロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

この例では、Northwind サンプル データベースからデータを取得し、Microsoft Office Outlook のコンボ ボックスとメニューに読み込みます。 これらのコントロールで選択した項目は、電子メール メッセージの[宛先][件名] などのフィールドに自動的に読み込まれます。

このチュートリアルでは、次の作業について説明します。

  • 新しい Outlook VSTO アドイン プロジェクトを作成します。

  • カスタム リボン グループをデザインします。

  • 組み込みタブにカスタム グループを追加します。

  • 実行時にリボン上のコントロールを更新します。

Note

次の手順で参照している 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.cs または CustomerRibbon.vb ファイルが開き、既定のタブとグループが表示されます。

  4. リボン デザイナーをクリックして選択します。

  5. [プロパティ] ウィンドウで、[RibbonType] プロパティの隣のドロップダウン矢印をクリックし、[Microsoft.Outlook.Mail.Compose] をクリックします。

    これにより、ユーザーが Outlook で新しいメール メッセージを作成するときにリボンを表示できます。

  6. リボン デザイナーで、[Group1] をクリックして選択します。

  7. [プロパティ] ウィンドウで、[ラベル] を「顧客の購入」に設定します。

  8. [ツールボックス][Office リボン コントロール] タブから [コンボ ボックス][顧客の購入] グループにドラッグします。

  9. [ComboBox1] をクリックして選択します。

  10. [プロパティ] ウィンドウで、[ラベル][顧客] に設定します。

  11. [ツールボックス][Office リボン コントロール] タブから [メニュー][顧客の購入] グループにドラッグします。

  12. [プロパティ] ウィンドウで、[ラベル] を「購入した製品」に設定します。

  13. [ダイナミック]true に設定します。

    これにより、リボンが Office アプリケーションに読み込まれた後に、実行時にメニュー上のコントロールを追加および削除できます。

組み込みタブにカスタム グループを追加する

組み込みタブは、Outlook エクスプローラーまたはインスペクターのリボンに始めから含まれているタブです。 この手順では、組み込みタブにカスタム グループを追加し、タブ上のカスタム グループの位置を指定します。

組み込みタブにカスタム グループを追加するには

  1. [TabAddins (ビルトイン)] タブをクリックして選択します。

  2. [プロパティ] ウィンドウで、[ControlId] プロパティを展開し、[OfficeId][TabNewMailMessage] に設定します。

    これにより、[顧客の購入] グループが、新しいメール メッセージ内に表示されるリボンの [メッセージ] タブに追加されます。

  3. [顧客の購入] グループをクリックして選択します。

  4. [プロパティ] ウィンドウで、[位置] プロパティを展開し、[PositionType] プロパティの隣にあるドロップダウン矢印をクリックして [BeforeOfficeId] をクリックします。

  5. [OfficeId] プロパティを [GroupClipboard] に設定します。

    これにより、[顧客の購入] グループが [メッセージ] タブの [クリップボード] グループの前に配置されます。

データ ソースを作成する

[データ ソース] ウィンドウを使用して、型指定されたデータセットをプロジェクトに追加します。

データ ソースを作成するには

  1. [データ] メニューの [新しいデータ ソースの追加]をクリックします。

    これにより、データ ソース構成ウィザードが開始されます。

  2. [データベース] を選択し、[次へ] をクリックします。

  3. [データセット] を選択し、[次へ] をクリックします。

  4. Microsoft SQL Server Compact 4.0 の Northwind サンプル データベースへのデータ接続を選択するか、または [新しい接続] ボタンを使用して新しい接続を追加します。

  5. 接続を選択または作成したら、[次へ] をクリックします。

  6. [次へ] をクリックして接続文字列を保存します。

  7. [データベース オブジェクトの選択] ページの [テーブル] を展開します。

  8. 次の各テーブルの横にあるチェック ボックスをオンにします。

    1. 顧客

    2. 注文の詳細

    3. Orders (注文)

    4. 製品

  9. [完了] をクリックします。

実行時にカスタム グループ内のコントロールを更新する

リボン オブジェクト モデルを使用して、以下のタスクを実行します。

  • [顧客] コンボ ボックスに顧客名を追加します。

  • [購入した製品] メニューに、販売注文と販売済み製品を表すメニューおよびボタン コントロールを追加します。

  • [顧客] コンボ ボックスと [購入した製品] メニューのデータを使用して、新しいメール メッセージの [宛先]、[件名]、および [本文] フィールドを設定します。

リボン オブジェクト モデルを使用してカスタム グループのコントロールを更新するには

  1. [プロジェクト] メニューの [参照の追加] をクリックします。

  2. [参照の追加] ダイアログ ボックスで、[.NET] タブをクリックし、System.Data.Linq アセンブリを選択して [OK] をクリックします。

    このアセンブリには、統合言語クエリ (LINQ) を使用するためのクラスが含まれています。 ここでは、LINQ を使用して Northwind データベースから取得したデータをカスタム グループのコントロールに読み込みます。

  3. ソリューション エクスプローラーで、CustomerRibbon.cs または CustomerRibbon.vb をクリックして選択します。

  4. [表示] メニューの [コード]をクリックします。

    コード エディターでリボン コード ファイルが開きます。

  5. リボン コード ファイルの先頭に次のステートメントを追加します。 これらのステートメントによって、LINQ 名前空間や Outlook プライマリ相互運用機能アセンブリ (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 データベースの Customer、Orders、Order Details、および Product テーブルから取得した情報を格納するために使用するデータ テーブルおよびテーブル アダプターを宣言します。

    //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 クラスに次のコード ブロックを追加します。 このコードによって、実行時にリボンのコントロールを作成する 3 つのヘルパー メソッドが追加されます。

    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 件の顧客の ID と名前を使用して [顧客] コンボ ボックスを設定します。

    • PopulateSalesOrderInfo ヘルパー メソッドを呼び出す。 このメソッドでは、現在選択されている顧客に関連する販売注文番号で [購入した製品] メニューを更新します。

      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 クエリを使用して以下のタスクを実行します。

    • 選択されている顧客に関連する個々の販売注文を示すサブメニューを [購入した製品] メニューに追加します。

    • 販売注文に関連する製品を示すボタンを各サブメニューに追加する。

    • 各ボタンにイベントハンドラーを追加する。

      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 ヘルパー メソッドを呼び出す。 このメソッドでは、選択されている顧客に関連する販売注文で [購入した製品] メニューを更新します。

    • PopulateMailItem ヘルパー メソッドを呼び出し、現在のテキスト (つまり、選択されている顧客の名前) を渡します。 このメソッドでは、新しいメール メッセージの [宛先]、[件名]、[本文] フィールドを設定します。

      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 をカスタマイズする方法の詳細については、次のトピックで説明します。