チュートリアル : 実行時のリボン コントロールの更新
このチュートリアルでは、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 アドイン プロジェクトを作成するには
Visual Studioでは、Ribbon_Update_At_Runtimeという名前の Outlook 2013 の Outlook 2010 またはアドイン プロジェクトを作成します。
[新しいプロジェクト] ダイアログ ボックスの [ソリューションのディレクトリを作成] チェック ボックスをオンにします。
プロジェクトを既定のプロジェクト ディレクトリに保存します。
詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。
カスタム リボン グループのデザイン
この例のリボンは、ユーザーが新しいメール メッセージを作成するときに表示されます。リボンのカスタム グループを作成するには、まずプロジェクトにリボン項目を追加し、次にリボン デザイナーでカスタム グループをデザインします。このカスタム グループでは、データベースから顧客名と注文履歴を取得して、顧客へのフォローアップ電子メール メッセージを作成できます。
カスタム グループをデザインするには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナー)] をクリックします。
新しいリボンの名前を CustomerRibbon に変更し、[追加] をクリックします。
リボン デザイナーで CustomerRibbon.cs ファイルまたは CustomerRibbon.vb ファイルが開き、既定のタブとグループが表示されます。
リボン デザイナーをクリックして選択します。
[プロパティ] ウィンドウで、[RibbonType] プロパティの隣のドロップダウン矢印をクリックし、[Microsoft.Outlook.Mail.Compose] をクリックします。
これにより、ユーザーが Outlook で新しいメール メッセージを作成するときにリボンが表示されます。
リボン デザイナーで [Group1] をクリックして選択します。
[プロパティ] ウィンドウで、[ラベル] を Customer Purchases に設定します。
[ツールボックス] の [Office リボン コントロール] タブから ComboBox を [Customer Purchases] グループにドラッグします。
[ComboBox1] をクリックして選択します。
[プロパティ] ウィンドウで、[ラベル] を Customers に設定します。
[ツールボックス] の [Office リボン コントロール] タブから Menu を [Customer Purchases] グループにドラッグします。
[プロパティ] ウィンドウで、[ラベル] を Product Purchased に設定します。
[ダイナミック] を true に設定します。
これにより、リボンが Office アプリケーションに読み込まれた後で、実行時にメニュー上のコントロールを追加および削除できます。
カスタム グループの組み込みタブへの追加
組み込みタブは、Outlook エクスプローラーまたはインスペクターのリボンに始めから含まれているタブです。この手順では、組み込みタブにカスタム グループを追加し、タブ上のカスタム グループの位置を指定します。
組み込みタブにカスタム グループを追加するには
[TabAddIns (ビルトイン)] タブをクリックして選択します。
[プロパティ] ウィンドウで、[ControlId] プロパティを展開し、[OfficeId] を TabNewMailMessage に設定します。
[Customer Purchases] グループが新しいメール メッセージ内に表示されるリボンの [Messages] タブに追加されます。
[Customer Purchases] グループをクリックして選択します。
[プロパティ] ウィンドウで、[位置] プロパティを展開し、[PositionType] プロパティの隣にあるドロップダウン矢印をクリックします。次に、[BeforeOfficeId] をクリックします。
[OfficeId] プロパティを GroupClipboard に設定します。
これにより、[Customer Purchases] グループが [Messages] タブの [Clipboard] グループの前に配置されます。
データ ソースの作成
[データ ソース] ウィンドウを使用して型指定されたデータセットをプロジェクトに追加します。
データ ソースを作成するには
[データ] メニューの [新しいデータ ソースの追加] をクリックします。
これにより、データ ソース構成ウィザードが開始します。
[データベース] をクリックし、[次へ] をクリックします。
[データセット] をクリックし、[次へ] をクリックします。
Microsoft SQL Server Compact 4.0 の Northwind サンプル データベースへのデータ接続を選択するか、または [新しい接続] をクリックして新しい接続を追加します。
接続を選択または作成した後、[次へ] をクリックします。
[次へ] をクリックして接続文字列を保存します。
[データベース オブジェクトの選択] ページの [テーブル] を展開します。
次の各テーブルの横にあるチェック ボックスをオンにします。
Customers
Order Details
Orders
Products
[完了] をクリックします。
実行時のカスタム グループのコントロールの更新
リボン オブジェクト モデルを使用して、以下のタスクを実行します。
[Customers] ボックスに顧客名を追加する。
[Products Purchased] メニューに販売注文と販売済み製品を表すメニュー コントロールおよびボタン コントロールを追加する。
[Customers] ボックスと [Products Purchased] メニューを使用して、新しいメール メッセージの To、Subject、Body の各フィールドにデータを追加する。
リボン オブジェクト モデルを使用してカスタム グループのコントロールを更新するには
[プロジェクト] メニューの [参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスで、[.NET] タブをクリックし、System.Data.Linq アセンブリを選択して、[OK] をクリックします。
このアセンブリには、統合言語クエリ (LINQ: Language-Integrated Query) を使用するためのクラスが含まれています。ここでは、LINQ を使用して、カスタム グループのコントロールに Northwind データベースから取得したデータを追加します。
ソリューション エクスプローラーで、CustomerRibbon.cs または CustomerRibbon.vb をクリックして選択します。
[表示] メニューの [コード] をクリックします。
コード エディターでリボン コード ファイルが開きます。
リボン コード ファイルの先頭に次のステートメントを追加します。これらのステートメントによって、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;
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();
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; }
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(); }
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); } } }
ソリューション エクスプローラーで、リボン コード ファイルをダブルクリックします。
リボン デザイナーが開きます。
リボン デザイナーで [Customers] ボックスをダブルクリックします。
リボン コード ファイルがコード エディターで開き、ComboBox1_TextChanged イベント ハンドラーが表示されます。
ComboBox1_TextChanged イベント ハンドラーを次のコードで置き換えます。このコードは次のタスクを実行します。
PopulateSalesOrderInfo ヘルパー メソッドを呼び出す。このメソッドは、現在選択されている顧客の販売注文で [Products Purchased] メニューを更新します。
PopulateMailItem ヘルパー メソッドを呼び出し、現在のテキスト (つまり、選択されている顧客の名前) を渡します。このメソッドは、新しいメール メッセージの To、Subject、Body の各フィールドにデータを追加します。
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); }
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; }
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 データベースから取得されたデータで更新されます。
カスタム グループのコントロールをテストするには
F5 キーを押してプロジェクトを実行します。
Outlook が起動します。
Outlook で、[ファイル] メニューの [新規作成] をポイントし、[メール メッセージ] をクリックします。
次の処理が実行されます。
新しいメール メッセージ インスペクター ウィンドウが表示されます。
リボンの [Message] タブに含まれる [Clipboard] グループの前に [Customer Purchases] グループが表示されます。
そのグループ内の [Customers] ボックスが Northwind データベースから取得された顧客の名前で更新されます。
リボンの [Message] タブの [Customer Purchases] グループで、[Customers] ボックスから顧客を選択します。
次の処理が実行されます。
選択されている顧客の個々の販売注文を示すように、[Products Purchased] メニューが更新されます。
その注文で購入された商品を示すように、販売注文の各サブメニューが更新されます。
選択した顧客の電子メール アドレスがメール メッセージの [宛先] 行に追加され、メール メッセージの件名と本文にテキストが挿入されます。
[Products Purchased] メニューをクリックし、いずれかの販売注文をポイントして、その販売注文に含まれる製品をクリックします。
選択した製品の名前がメール メッセージの本文に追加されます。
次の手順
Office UI をカスタマイズする方法の詳細については、次のトピックで説明します。
ドキュメント レベルのカスタマイズにコンテキスト ベースの UI を追加する。詳細については、「操作ウィンドウの概要」を参照してください。
標準またはカスタムの Microsoft Office Outlook フォームを拡張する。詳細については、「チュートリアル : Outlook フォーム領域のデザイン」を参照してください。
Outlook にカスタム作業ウィンドウを追加する。詳細については、「カスタム作業ウィンドウ」を参照してください。
参照
処理手順
チュートリアル : リボン デザイナーを使用したカスタム タブの作成
方法 : リボンをリボン デザイナーからリボン XML にエクスポートする
方法 : アドインのユーザー インターフェイス エラーを表示する