연습: 런타임에 리본 메뉴의 컨트롤 업데이트
이 연습에서는 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 개발자 도구를 포함하는 Visual Studio 2012 버전입니다. 자세한 내용은 [Office 솔루션을 개발할 수 있도록 컴퓨터 구성](bb398242\(v=vs.110\).md)을 참조하십시오.
- Microsoft Outlook 2010 또는 Office 2013.
새 Outlook 추가 기능 프로젝트 만들기
먼저 Outlook 추가 기능 프로젝트를 만듭니다.
새 Outlook 추가 기능 프로젝트를 만들려면
Visual Studio, 만들기는 Outlook 2010 또는 Outlook 2013 추가 기능 프로젝트의 이름 ribbon_update_at_runtime로 합니다.
새 프로젝트 대화 상자에서 솔루션용 디렉터리 만들기를 선택합니다.
프로젝트를 기본 프로젝트 디렉터리에 저장합니다.
자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기을 참조하십시오.
사용자 지정 리본 그룹 디자인
이 예제의 리본 메뉴는 사용자가 새 메일 메시지를 작성할 때 나타납니다.리본 메뉴의 사용자 지정 그룹을 만들려면 먼저 프로젝트에 리본 항목을 추가한 다음 리본 디자이너에서 그룹을 디자인합니다.이 사용자 지정 그룹을 사용하면 데이터베이스에서 이름 및 주문 기록을 가져와서 고객에게 보낼 후속 전자 메일 메시지를 손쉽게 생성할 수 있습니다.
사용자 지정 그룹을 디자인하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 **리본(비주얼 디자이너)**을 선택합니다.
새 리본 메뉴의 이름을 CustomerRibbon으로 바꾸고 추가를 클릭합니다.
CustomerRibbon.cs 또는 CustomerRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.
리본 디자이너를 클릭하여 선택합니다.
속성 창에서 RibbonType 속성 옆의 드롭다운 화살표를 클릭하고 Microsoft.Outlook.Mail.Compose를 클릭합니다.
이렇게 하면 사용자가 Outlook에서 새 메일 메시지를 작성할 때 리본 메뉴가 나타납니다.
리본 디자이너에서 Group1을 클릭하여 선택합니다.
속성 창에서 Label을 Customer Purchases로 설정합니다.
도구 상자의 Office 리본 컨트롤 탭에서 ComboBox를 Customer Purchases 그룹으로 끌어 옵니다.
ComboBox1을 클릭하여 선택합니다.
속성 창에서 Label을 Customers로 설정합니다.
도구 상자의 Office 리본 컨트롤 탭에서 Menu를 Customer Purchases 그룹으로 끌어 옵니다.
속성 창에서 Label을 Product Purchased로 설정합니다.
동적을 true로 설정합니다.
이렇게 하면 Office 응용 프로그램에 리본 메뉴를 로드한 후 런타임에 메뉴의 컨트롤을 추가 및 제거할 수 있습니다.
기본 제공 탭에 사용자 지정 그룹 추가
기본 제공 탭은 Outlook 탐색기 또는 검사기의 리본 메뉴에 이미 포함된 탭입니다.이 프로시저에서는 기본 제공 탭에 사용자 지정 그룹을 추가한 다음 탭에서 사용자 지정 그룹이 표시되는 위치를 지정합니다.
기본 제공 탭에 사용자 지정 그룹을 추가하려면
TabAddins (기본 제공) 탭을 클릭하여 선택합니다.
속성 창에서 ControlId 속성을 확장한 다음 OfficeId를 TabNewMailMessage로 설정합니다.
이렇게 하면 새 메일 메시지에 나타나는 리본 메뉴의 메시지 탭에 Customer Purchases 그룹이 추가됩니다.
Customer Purchases 그룹을 클릭하여 선택합니다.
속성 창에서 Position 속성을 확장하고 PositionType 속성 옆의 드롭다운 화살표를 클릭한 다음 BeforeOfficeId를 클릭합니다.
OfficeId 속성을 GroupClipboard로 설정합니다.
이렇게 하면 메시지 탭의 클립보드 그룹 앞에 Customer Purchases 그룹이 배치됩니다.
데이터 소스 만들기
데이터 소스 창을 사용하여 형식화된 데이터 집합을 프로젝트에 추가합니다.
데이터 소스를 만들려면
데이터 메뉴에서 새 데이터 소스 추가를 클릭합니다.
그러면 데이터 소스 구성 마법사가 시작됩니다.
데이터베이스를 선택하고 다음을 클릭합니다.
데이터 집합을 선택하고 다음을 클릭합니다.
Northwind 샘플 Microsoft SQL Server Compact 4.0 데이터베이스에 대한 데이터 연결을 선택하거나, 새 연결 단추를 사용하여 새 연결을 추가합니다.
연결을 선택하거나 만든 후 다음을 클릭합니다.
다음을 클릭하여 연결 문자열을 저장합니다.
데이터베이스 개체 선택 페이지에서 테이블을 확장합니다.
다음 각 테이블 옆의 확인란을 선택합니다.
Customers
Order Details
Orders
Products
마침을 클릭합니다.
런타임에 사용자 지정 그룹의 컨트롤 업데이트
리본 개체 모델을 사용하여 다음 작업을 수행할 수 있습니다.
Customers 콤보 상자에 고객 이름을 추가합니다.
Products Purchased 메뉴에 판매 주문과 판매된 제품을 나타내는 메뉴 및 단추 컨트롤을 추가합니다.
Customers 콤보 상자 및 Products Purchased 메뉴의 데이터를 사용하여 새 메일 메시지의 To, Subject 및 Body 필드를 채웁니다.
리본 개체 모델을 사용하여 사용자 지정 그룹의 컨트롤을 업데이트하려면
프로젝트 메뉴에서 참조 추가를 클릭합니다.
참조 추가 대화 상자에서 .NET을 클릭하고 System.Data.Linq 어셈블리를 선택한 다음 확인을 클릭합니다.
이 어셈블리에는 LINQ(통합 언어 쿼리)를 사용하기 위한 클래스가 들어 있습니다.LINQ는 사용자 지정 그룹의 컨트롤을 Northwind 데이터베이스의 데이터로 채우는 데 사용합니다.
솔루션 탐색기에서 CustomerRibbon.cs 또는 CustomerRibbon.vb를 클릭하여 선택합니다.
보기 메뉴에서 코드를 클릭합니다.
코드 편집기에서 리본 코드 파일이 열립니다.
리본 코드 파일의 맨 위에 다음 문을 추가합니다.이러한 문은 LINQ 네임스페이스와 Outlook PIA(주 interop 어셈블리)의 네임스페이스에 쉽게 액세스할 수 있게 해 줍니다.
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 클래스입니다.이 코드는 런타임에 리본 메뉴의 컨트롤을 만드는 세 개의 도우미 메서드를 추가합니다.
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 도우미 메서드를 호출합니다.이 메서드는 현재 선택된 고객과 관련된 판매 주문 번호로 Products Purchased 메뉴를 업데이트합니다.
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 쿼리를 사용하여 다음 작업을 수행합니다.
Products Purchased 메뉴에 선택된 고객과 관련된 각 판매 주문에 대한 하위 메뉴를 추가합니다.
각 하위 메뉴에 해당 판매 주문과 관련된 제품에 대한 단추를 추가합니다.
각 단추에 이벤트 처리기를 추가합니다.
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에서 새 메일 양식을 열면 리본 메뉴의 메시지 탭에 Customer Purchases라는 사용자 지정 그룹이 나타납니다.
고객에 대한 후속 전자 메일 메시지를 만들려면 고객을 선택한 다음 해당 고객이 구입한 제품을 선택합니다.Customer Purchases 그룹의 컨트롤은 런타임에 Northwind 데이터베이스의 데이터로 업데이트됩니다.
사용자 지정 그룹의 컨트롤을 테스트하려면
F5 키를 눌러 프로젝트를 실행합니다.
Outlook이 시작됩니다.
Outlook의 파일 메뉴에서 새로 만들기를 가리킨 다음 메일 메시지를 클릭합니다.
다음 동작이 발생합니다.
새 메일 메시지 검사기 창이 나타납니다.
리본 메뉴의 메시지 탭에서 클립보드 그룹 앞에 Customer Purchases 그룹이 나타납니다.
그룹의 Customers 콤보 상자가 Northwind 데이터베이스에 있는 고객의 이름으로 업데이트됩니다.
리본 메뉴의 메시지 탭에 있는 Customer Purchases 그룹의 Customers 콤보 상자에서 고객을 선택합니다.
다음 동작이 발생합니다.
Products Purchased 메뉴가 업데이트되어 선택한 고객의 각 판매 주문이 표시됩니다.
각 판매 주문 하위 메뉴가 업데이트되어 해당 주문에서 구입한 제품이 표시됩니다.
선택된 고객의 전자 메일 주소가 메일 메시지의 받는 사람 줄에 추가되고 메일 메시지의 제목 및 본문에 텍스트가 채워집니다.
Products Purchases 메뉴를 클릭하고 아무 판매 주문이나 가리킨 다음 판매 주문의 제품을 클릭합니다.
해당 제품 이름이 메일 메시지의 본문에 추가됩니다.
다음 단계
다음 항목에서는 Office UI를 사용자 지정하는 방법에 대해 더 자세히 설명합니다.
문서 수준 사용자 지정에 컨텍스트 기반 UI를 추가합니다.자세한 내용은 작업 창 개요을 참조하십시오.
표준 또는 사용자 지정 Microsoft Office Outlook 양식을 확장합니다.자세한 내용은 연습: Outlook 양식 영역 디자인을 참조하십시오.
Outlook에 사용자 지정 작업 창을 추가합니다.자세한 내용은 사용자 지정 작업 창을 참조하십시오.
참고 항목
작업
연습: 리본 디자이너를 사용하여 사용자 지정 탭 만들기
방법: 리본 디자이너에서 리본 XML로 리본 메뉴 내보내기