チュートリアル : 実行時のリボン コントロールの更新
このチュートリアルでは、Office アプリケーションへのリボンの読み込み後にリボン オブジェクト モデルを使用してリボン上のコントロールを更新する方法を説明します。
対象: このトピックの情報は、Excel 2007 と Excel 2010、InfoPath 2010、Outlook 2007 と Outlook 2010、PowerPoint 2007 と PowerPoint 2010、Project 2010、Visio 2010、および Word 2007 と Word 2010 のドキュメント レベルのプロジェクトおよびアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
この例では、Northwind サンプル データベースからデータを取得し、Microsoft Office Outlook のコンボ ボックスとメニューに追加します。 これらのコントロールで選択した項目は、電子メール メッセージの "宛先" や "件名" などのフィールドに自動的に読み込まれます。
このチュートリアルでは、次の作業について説明します。
新しい Outlook アドイン プロジェクトの作成
カスタム リボン グループのデザイン
組み込みタブへのカスタム グループの追加
実行時のリボン コントロールの更新
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。 詳細については、「設定の操作」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
-
Microsoft Office 開発者ツールを含むエディションの Visual Studio 2010。 詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.100\).md)」を参照してください。
- Microsoft Office Outlook 2007 または Microsoft Outlook 2010
新しい Outlook アドイン プロジェクトの作成
まず、Outlook アドイン プロジェクトを作成します。
新しい Outlook アドイン プロジェクトを作成するには
Visual Studio で、Ribbon_Update_At_Runtime という名前の Outlook 2007 または 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 3.5 の 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.NorthwindDataSetTableAdapters
using System.Data.Linq; using System.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.NorthwindDataSetTableAdapters;
CustomerRibbon クラス内に次のコードを追加します。 このコードでは、Northwind データベースの Customer、Orders、Order Details、および Product の各テーブルからの情報を格納するために使用するデータ テーブルおよびテーブル アダプターを宣言しています。
'Declare the Northwind data set. Dim nwDataSet As NorthwindDataSet = New NorthwindDataSet() 'Declare the data tables. Dim customerTable As NorthwindDataSet.CustomersDataTable Dim orderTable As NorthwindDataSet.OrdersDataTable Dim orderDetailsTable As NorthwindDataSet.Order_DetailsDataTable Dim productsTable As NorthwindDataSet.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. NorthwindDataSet nwDataSet = new NorthwindDataSet(); //Declare the data tables. NorthwindDataSet.CustomersDataTable customerTable; NorthwindDataSet.OrdersDataTable orderTable; NorthwindDataSet.Order_DetailsDataTable orderDetailsTable; NorthwindDataSet.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 つのヘルパー メソッドを追加します。
.NET Framework 4 を対象とするプロジェクトの場合は、次のコードを追加します。
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; }
.NET Framework 3.5 を対象とするプロジェクトの場合は、次のコードを追加します。
Private Function CreateRibbonDropDownItem() As RibbonDropDownItem Return New RibbonDropDownItem() End Function Private Function CreateRibbonMenu() As RibbonMenu Return New RibbonMenu() End Function Private Function CreateRibbonButton() As RibbonButton Dim button As RibbonButton = New RibbonButton() AddHandler (button.Click), AddressOf Button_Click Return button End Function
private RibbonDropDownItem CreateRibbonDropDownItem() { return new RibbonDropDownItem(); } private RibbonMenu CreateRibbonMenu() { return new RibbonMenu(); } private RibbonButton CreateRibbonButton() { RibbonButton button = new RibbonButton(); button.Click += new EventHandler<RibbonControlEventArgs>(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 にカスタム作業ウィンドウを追加する。 詳細については、「カスタム作業ウィンドウの概要」を参照してください。
参照
処理手順
チュートリアル : リボン デザイナーを使用したカスタム タブの作成
方法 : Microsoft Office メニューをカスタマイズする
方法 : リボンをリボン デザイナーからリボン XML にエクスポートする
方法 : アドインのユーザー インターフェイス エラーを表示する