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

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

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

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

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

  • 新しい Outlook アドイン プロジェクトの作成

  • カスタム リボン グループのデザイン

  • 組み込みタブへのカスタム グループの追加

  • 実行時のリボン コントロールの更新

[!メモ]

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

-

Microsoft Office Developer Tools が含まれているエディションの Visual Studio 2012。詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.110\).md)」を参照してください。
  • Microsoft Outlook 2010または Office 2013。

新しい Outlook アドイン プロジェクトの作成

まず、Outlook アドイン プロジェクトを作成します。

新しい Outlook アドイン プロジェクトを作成するには

  1. Visual Studioでは、Ribbon_Update_At_Runtimeという名前の Outlook 2013 の Outlook 2010 またはアドイン プロジェクトを作成します。

  2. [新しいプロジェクト] ダイアログ ボックスの [ソリューションのディレクトリを作成] チェック ボックスをオンにします。

  3. プロジェクトを既定のプロジェクト ディレクトリに保存します。

    詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。

カスタム リボン グループのデザイン

この例のリボンは、ユーザーが新しいメール メッセージを作成するときに表示されます。リボンのカスタム グループを作成するには、まずプロジェクトにリボン項目を追加し、次にリボン デザイナーでカスタム グループをデザインします。このカスタム グループでは、データベースから顧客名と注文履歴を取得して、顧客へのフォローアップ電子メール メッセージを作成できます。

カスタム グループをデザインするには

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

  2. [新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナー)] をクリックします。

  3. 新しいリボンの名前を CustomerRibbon に変更し、[追加] をクリックします。

    リボン デザイナーで CustomerRibbon.cs ファイルまたは CustomerRibbon.vb ファイルが開き、既定のタブとグループが表示されます。

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

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

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

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

  7. [プロパティ] ウィンドウで、[ラベル] を Customer Purchases に設定します。

  8. [ツールボックス][Office リボン コントロール] タブから ComboBox[Customer Purchases] グループにドラッグします。

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

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

  11. [ツールボックス][Office リボン コントロール] タブから Menu[Customer Purchases] グループにドラッグします。

  12. [プロパティ] ウィンドウで、[ラベル] を Product Purchased に設定します。

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

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

カスタム グループの組み込みタブへの追加

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

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

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

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

    [Customer Purchases] グループが新しいメール メッセージ内に表示されるリボンの [Messages] タブに追加されます。

  3. [Customer Purchases] グループをクリックして選択します。

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

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

    これにより、[Customer Purchases] グループが [Messages] タブの [Clipboard] グループの前に配置されます。

データ ソースの作成

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

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

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

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

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

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

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

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

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

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

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

    1. Customers

    2. Order Details

    3. Orders

    4. Products

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

実行時のカスタム グループのコントロールの更新

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

  • [Customers] ボックスに顧客名を追加する。

  • [Products Purchased] メニューに販売注文と販売済み製品を表すメニュー コントロールおよびボタン コントロールを追加する。

  • [Customers] ボックスと [Products Purchased] メニューを使用して、新しいメール メッセージの ToSubjectBody の各フィールドにデータを追加する。

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

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

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

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

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

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

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

  5. リボン コード ファイルの先頭に次のステートメントを追加します。これらのステートメントによって、LINQ 名前空間や Outlook プライマリ相互運用機能アセンブリ (PIA) の名前空間に容易にアクセスできます。

    Imports System.Data.Linq
    Imports System.Linq
    Imports System.Data.Linq.Mapping
    Imports System.Linq.Expressions
    Imports Outlook = Microsoft.Office.Interop.Outlook
    Imports Ribbon_Update_At_Runtime.Northwind40DataSetTableAdapters
    
    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 data set.
    
        Dim nwDataSet As Northwind40DataSet = New Northwind40DataSet()
    
        'Declare the data tables.
    
        Dim customerTable As Northwind40DataSet.CustomersDataTable
        Dim orderTable As Northwind40DataSet.OrdersDataTable
        Dim orderDetailsTable As Northwind40DataSet.Order_DetailsDataTable
        Dim productsTable As Northwind40DataSet.ProductsDataTable
    
        'Declare the data table adapters for each table.
    
        Dim customersTableAdapter As CustomersTableAdapter = New CustomersTableAdapter()
        Dim ordersTableAdapter As OrdersTableAdapter = New OrdersTableAdapter()
        Dim detailsTableAdapter As Order_DetailsTableAdapter = New Order_DetailsTableAdapter()
        Dim productsTableAdapter As ProductsTableAdapter = New ProductsTableAdapter()
    
    
    //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 Function CreateRibbonDropDownItem() As RibbonDropDownItem
        Return Me.Factory.CreateRibbonDropDownItem()
    End Function
    
    Private Function CreateRibbonMenu() As RibbonMenu
        Return Me.Factory.CreateRibbonMenu()
    End Function
    
    Private Function CreateRibbonButton() As RibbonButton
        Dim button As RibbonButton = Me.Factory.CreateRibbonButton()
        AddHandler (button.Click), AddressOf Button_Click
        Return button
    End Function
    
    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 と名前を **[Customers]**ボックスに追加する。

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

        Private Sub CustomerRibbon_Load(ByVal sender As System.Object, _
       ByVal e As Microsoft.Office.Tools.Ribbon.RibbonUIEventArgs) _
           Handles MyBase.Load
    
            customerTable = nwDataSet.Customers
            customersTableAdapter.Fill(customerTable)
    
            Dim customerQuery = From customers In customerTable.AsEnumerable.Take(20) _
                    Select CustomerID = customers.Customer_ID, _
                    CustomerName = customers.Contact_Name
    
            ' Execute the query.
            For Each item In customerQuery
                Me.ComboBox1.Items.Add(CreateRibbonDropDownItem())
    
                Me.ComboBox1.Items.Last().Label = item.CustomerID.ToString() _
                    + "|" + item.CustomerName
            Next item
    
            Me.ComboBox1.Text = Me.ComboBox1.Items.First().Label
            PopulateSalesOrderInfo()
        End Sub
    
    
    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 Sub PopulateSalesOrderInfo()
    
        Dim tempArray As [String]() = comboBox1.Text.Split(New [Char]() {"|"c})
        Menu1.Items.Clear()
    
        orderTable = nwDataSet.Orders
        orderDetailsTable = nwDataSet.Order_Details
        productsTable = nwDataSet.Products
    
        ordersTableAdapter.Fill(orderTable)
        detailsTableAdapter.Fill(orderDetailsTable)
        productsTableAdapter.Fill(productsTable)
    
        Dim orderQuery = From order In orderTable.AsEnumerable() _
                         Where order.Customer_ID.ToString() = tempArray(0) _
                         Select New With {.SalesOrderID = order.Order_ID}
    
        For Each orderItem In orderQuery
            Me.Menu1.Items.Add(CreateRibbonMenu())
    
            Dim orderMenu As RibbonMenu = CType(Menu1.Items.Last(), RibbonMenu)
            orderMenu.Dynamic = True
            orderMenu.Label = orderItem.SalesOrderID.ToString()
            orderMenu.Tag = orderItem.SalesOrderID
    
            Dim productQuery = From orderDetail In orderDetailsTable.AsEnumerable(), _
                                   product In productsTable.AsEnumerable() _
                               Where orderDetail.Product_ID = _
                                   product.Product_ID _
                               And orderDetail.Order_ID = _
                               orderMenu.Tag _
            Select productName = product.Product_Name
    
            For Each productItem In productQuery
                Dim button As RibbonButton = CreateRibbonButton()
                button.Label = productItem
                orderMenu.Items.Add(button)
            Next productItem
        Next orderItem
    End Sub
    
    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. リボン デザイナーで [Customers] ボックスをダブルクリックします。

    リボン コード ファイルがコード エディターで開き、ComboBox1_TextChanged イベント ハンドラーが表示されます。

  12. ComboBox1_TextChanged イベント ハンドラーを次のコードで置き換えます。このコードは次のタスクを実行します。

    • PopulateSalesOrderInfo ヘルパー メソッドを呼び出す。このメソッドは、現在選択されている顧客の販売注文で [Products Purchased] メニューを更新します。

    • PopulateMailItem ヘルパー メソッドを呼び出し、現在のテキスト (つまり、選択されている顧客の名前) を渡します。このメソッドは、新しいメール メッセージの ToSubjectBody の各フィールドにデータを追加します。

    Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
            Handles ComboBox1.TextChanged
        PopulateSalesOrderInfo()
        PopulateMailItem(ComboBox1.Text)
    End Sub
    
    private void comboBox1_TextChanged(object sender,
        RibbonControlEventArgs e)
    {
        PopulateSalesOrderInfo();
        PopulateMailItem(comboBox1.Text);
    }
    
  13. CustomerRibbon クラスに以下の Click イベント ハンドラーを追加します。このコードは、選択された製品の名前を新しいメール メッセージの Body フィールドに追加します。

    Private Sub Button_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs)
        Dim application As Outlook.Application = Globals.ThisAddIn.Application
        Dim inspector As Outlook.Inspector = application.ActiveInspector()
        Dim myMailItem As Outlook.MailItem = CType(inspector.CurrentItem,  _
            Outlook.MailItem)
        Dim myButton As RibbonButton = CType(sender, RibbonButton)
        myMailItem.Subject = "Following up on your order"
        myMailItem.Body = myMailItem.Body + ControlChars.Lf + "* " _
            + myButton.Label
    End Sub
    
    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 クラスに次のコードを追加します。このコードは次のタスクを実行します。

    • 新しいメール メッセージの To 行に、現在選択されている顧客の電子メール アドレスを追加する。

    • 新しいメール メッセージの Subject フィールドと Body フィールドにテキストを追加する。

    Private Sub PopulateMailItem(ByVal addressToLine As String)
        Dim application As Outlook.Application = Globals.ThisAddIn.Application
        Dim inspector As Outlook.Inspector = application.ActiveInspector()
        Dim myMailItem As Outlook.MailItem = _
            CType(inspector.CurrentItem, Outlook.MailItem)
    
        myMailItem.To = ""
        Dim tempArray As [String]() = addressToLine.Split(New [Char]() {"|"c})
        myMailItem.To = tempArray(1) + "@example.com"
        myMailItem.Subject = "Following up on your order"
        myMailItem.Body = "Hello " + tempArray(1) + "," _
            + ControlChars.Lf + "We would like to get your feedback" + _
            "on the following products that you recently ordered: "
    End Sub
    
    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 で新しいメールを開くと、リボンの [Messages] タブに [Customer Purchases] というカスタム グループが表示されます。

顧客へのフォローアップ電子メール メッセージを作成するには、顧客を選択し、その顧客が購入した製品を選択します。[Customer Purchases] グループ内のコントロールが実行時に Northwind データベースから取得されたデータで更新されます。

カスタム グループのコントロールをテストするには

  1. F5 キーを押してプロジェクトを実行します。

    Outlook が起動します。

  2. Outlook で、[ファイル] メニューの [新規作成] をポイントし、[メール メッセージ] をクリックします。

    次の処理が実行されます。

    • 新しいメール メッセージ インスペクター ウィンドウが表示されます。

    • リボンの [Message] タブに含まれる [Clipboard] グループの前に [Customer Purchases] グループが表示されます。

    • そのグループ内の [Customers] ボックスが Northwind データベースから取得された顧客の名前で更新されます。

  3. リボンの [Message] タブの [Customer Purchases] グループで、[Customers] ボックスから顧客を選択します。

    次の処理が実行されます。

    • 選択されている顧客の個々の販売注文を示すように、[Products Purchased] メニューが更新されます。

    • その注文で購入された商品を示すように、販売注文の各サブメニューが更新されます。

    • 選択した顧客の電子メール アドレスがメール メッセージの [宛先] 行に追加され、メール メッセージの件名と本文にテキストが挿入されます。

  4. [Products Purchased] メニューをクリックし、いずれかの販売注文をポイントして、その販売注文に含まれる製品をクリックします。

    選択した製品の名前がメール メッセージの本文に追加されます。

次の手順

Office UI をカスタマイズする方法の詳細については、次のトピックで説明します。

参照

処理手順

方法 : リボンのカスタマイズの概要

チュートリアル : リボン デザイナーを使用したカスタム タブの作成

方法: リボンのタブの位置を変更する

方法 : 組み込みタブをカスタマイズする

方法: Backstage ビューにコントロールを追加する

方法 : リボンをリボン デザイナーからリボン XML にエクスポートする

方法 : アドインのユーザー インターフェイス エラーを表示する

概念

実行時のリボンへのアクセス

リボン デザイナー

リボン オブジェクト モデルの概要

Outlook のリボンのカスタマイズ

その他の技術情報

リボンの概要

統合言語クエリ (LINQ)