Поделиться через


Пошаговое руководство. Обновление элементов управления на ленте во время выполнения

В этом пошаговом руководстве показано, как использовать объектную модель ленты для обновления элементов управления на ленте после загрузки ленты в приложение 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.

Обязательные компоненты

Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.

-

Выпуск Visual Studio 2012, включающий инструменты разработчика Microsoft Office. Дополнительные сведения см. в разделе [Настройка компьютера для разработки решений Office](bb398242\(v=vs.110\).md).
  • Русская версия Microsoft Outlook 2010 или Office 2013.

Создание нового проекта надстройки для Outlook

Во-первых, создайте проект надстройки для Outlook.

Создание нового проекта надстройки Outlook

  1. В Visual Studio создайте проект надстройки Outlook 2010 или Outlook 2013 с именем Ribbon_Update_At_Runtime.

  2. В диалоговом окне Новый проект выберите команду Создать каталог для решения.

  3. Сохраните проект в каталог проекта по умолчанию.

    Дополнительные сведения см. в разделе Практическое руководство. Создание проектов Office в Visual Studio.

Создание пользовательской группы ленты.

Лента для этого примера появляется во время составления пользователем нового сообщения электронной почты.Чтобы создать пользовательскую группу для ленты, сначала добавьте элемент ленты в проект, и затем разработайте группу в конструкторе ленты.Эта пользовательская группа поможет сформировать последующие сообщения электронной почты путем извлечения имен и запроса историй из базы данных.

Создание пользовательской группы

  1. В меню Проект выберите команду Добавить новый элемент.

  2. В диалоговом окне Добавление нового элемента выберите элемент Лента (визуальный конструктор).

  3. Измените имя новой ленты на CustomerRibbon и нажмите кнопку Добавить.

    В конструкторе лент откроется файл CustomerRibbon.cs или CustomerRibbon.vb, также отобразится вкладка по умолчанию и группа.

  4. Щелкните конструктор ленты, чтобы выбрать ее.

  5. В окне Свойства рядом со свойством RibbonType щелкните стрелку выпадающего меню и выберите Microsoft.Outlook.Mail.Compose.

    Это делает возможным появление ленты во время составления пользователем нового почтового сообщения Outlook.

  6. В конструкторе лент щелкните ленту Group1, чтобы выбрать ее.

  7. В окне Свойства задайте для свойства Label значение "Покупки заказчика".

  8. Из вкладки Элементы управления ленты Office в панели элементов, перетащите ComboBox в группу Покупки заказчиков.

  9. Щелкните поле ComboBox1, чтобы выбрать его.

  10. В окне Свойства задайте для свойства Label значение "Заказчики".

  11. Из вкладки Элементы управления ленты Office в панели элементов, перетащите Меню в группу Покупки заказчиков.

  12. В окне Свойства задайте для свойства Label значение "Закупленный товар".

  13. Для Динамический установите значение true.

    Это дает возможность добавлять и удалять элементы управления в меню во время выполнения после загрузки ленты в приложение Office.

Добавление пользовательской группы к встроенной вкладке.

Встроенная вкладка — это вкладка, которая уже имеется на ленте проводника или инспектора Outlook.В этой процедуре к встроенной вкладке добавляется пользовательская группа, после чего задается позиция этой пользовательской группы во вкладке.

Добавление пользовательской группы к встроенной вкладке.

  1. Нажмите вкладку TabAddins (Built-In), чтобы выбрать ее.

  2. В окне Свойства раскройте свойство ControlId и задайте для свойства OfficeId значение "TabNewMailMessage".

    Это добавит группу Покупки заказчика к вкладке Сообщения ленты, которая появляется в новых почтовых сообщениях.

  3. Щелкните группу Покупки заказчика, чтобы выбрать ее.

  4. В окне Свойства разверните свойство Позиция, щелкните стрелку выпадающего меню и выберите свойство Тип позиции, затем щелкните BeforeOfficeId.

  5. Задайте для свойства OfficeId значение GroupClipboard.

    Это размещает группу Покупки заказчика перед группой Буфер обмена вкладки Сообщения.

Создание источника данных

Чтобы добавить типизированный набор данных в проект, следует использовать окно Источники данных.

Создание источника данных

  1. В меню Данные выберите команду Добавить новый источник данных.

    При этом запускается Мастер настройки источников данных.

  2. Выберите База данных и нажмите Далее.

  3. Выберите Набор данных и нажмите Далее.

  4. Выберите подключение к примеру базы данных Microsoft SQL Server Compact 4.0 "Northwind" или добавьте новое подключение с помощью кнопки Новое подключение.

  5. После выбора или создания подключения нажмите Далее.

  6. Нажмите Далее, чтобы сохранить строку подключения.

  7. На странице Выбор объектов базы данных разверните узел Таблицы.

  8. Установите флажки рядом с каждой из следующих таблиц.

    1. Customers

    2. Order Details

    3. Orders

    4. Продукция

  9. Нажмите кнопку Готово.

Обновление элементов управления в пользовательской группе во время выполнения

Ниже перечислены задачи, для выполнения которых используется объектная модель ленты:

  • Добавление имен клиентов в поле со списком Заказчики.

  • Добавьте элементы управления "Меню" и "Кнопка" в меню Закупленные товары, которое представляет заказы и проданные товары.

  • Заполнение полей To, Subject и Body новых почтовых сообщений данными из поля со списком Заказчики и меню Закупленные товары.

Обновление элементов управления в пользовательской группе с помощью объектной модели ленты

  1. В меню Проект щелкните команду Добавить ссылку.

  2. В диалоговом окне Добавление ссылки щелкните вкладку .NET, выберите сборку System.Data.Linq, а затем нажмите кнопку ОК.

    Эта сборка содержит классы для использования запросов, интегрированных в язык (LINQ — Language-Integrated Queries).LINQ будут использоваться для заполнения элементов управления в пользовательской группе данными из базы данных Northwind.

  3. В обозревателе решений, щелкните CustomerRibbon.cs или CustomerRibbon.vb, чтобы выбрать его.

  4. В меню Вид выберите пункт Код.

    В редакторе кода открывается файл кода ленты.

  5. Добавьте следующие инструкции в начало файла кода ленты.Эти инструкции обеспечивают легкий доступ к пространствам имен LINQ и к пространству имен основной сборки взаимодействия (PIA) Outlook.

    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 следующий код.Этот код объявляет таблицу данных и адаптеры таблиц, которые будут использоваться для хранения информации из таблиц "Customer", "Contact", "Sales Order Header", "Sales Order Detail" и "Product" из базы данных Northwind.

        '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.Этот код добавляет три вспомогательных метода, создающих элементы управления для ленты во время выполнения.

    
    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, чтобы выполнить следующие задачи:

    • Заполнить поле со списком Заказчики, используя идентификаторы и имена 20-ти заказчиков из базы данных Northwind.

    • Вызов вспомогательного метода PopulateSalesOrderInfo.Этот метод обновляет меню Закупленные товары номерами заказов, которые относятся к выбранному заказчику.

        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, чтобы выполнить следующие задачи:

    • Добавить в меню Закупленные товары подменю для каждого заказа, относящегося к текущему заказчику.

    • Добавляет кнопки к каждому подменю для товаров, относящихся к заказу.

    • Добавляет обработчики событий для каждой кнопки.

    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. В конструкторе лент дважды щелкните поле со списком Заказчики.

    В редакторе кода откроется файл кода ленты, и появится обработчик событий ComboBox1_TextChanged.

  12. Замените обработчик событий ComboBox1_TextChanged следующим кодом.Этот код выполняет следующие задачи:

    • Вызов вспомогательного метода PopulateSalesOrderInfo.Этот метод обновляет меню Закупленные товары заказами, которые относятся к выбранному заказчику.

    • Вызывает вспомогательный метод 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);
    }
    
  13. Добавляет следующий обработчик событий "Click" в класс CustomerRibbon.этом коде выполняется добавление названий выбранных товаров в поле 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, пользовательская группа с именем Покупки заказчиков появляется на вкладке ленты Сообщения.

Чтобы создать следующее сообщение электронной почты заказчику, выберите заказчика, затем выберите товары, приобретенные заказчиком.Элементы управления в группе Покупки заказчиков обновляются во время выполнения с использованием данных из базы данных Northwind.

Тестирование элементов управления в пользовательской группе

  1. Нажмите клавишу F5 для запуска проекта.

    Запускается Outlook.

  2. В Outlook в меню Файл переместите указатель мыши на Создать и нажмите Почтовое сообщение.

    Происходят следующие действия:

    • Появляется окно нового инспектора почтовых сообщений.

    • На вкладке ленты Сообщения группа Покупки Заказчика появляется перед группой Буфер обмена.

    • Поле со списком Заказчики в группе обновляется именами заказчиков в базе данных Northwind.

  3. На вкладке ленты Сообщение в группе Покупки заказчика выберите заказчика из поля со списком Заказчики.

    Происходят следующие действия:

    • Меню Закупленные товары обновляется для отображения всех заказов выбранного заказчика.

    • Каждое подменю заказа на покупку обновляется для отображения продуктов, приобретенных в этом заказе.

    • Адрес электронной почты выбранного заказчика добавляется в строку почтового сообщения Кому, а тема и основная часть почтового сообщения заполняются текстом.

  4. Щелкните меню Закупки Товаров, перейдите к любому заказу, затем щелкните на продукт из заказа.

    Имя продукта добавляется в основную часть почтового сообщения.

Следующие действия

Дополнительные сведения о настройке пользовательского интерфейса Office см. в следующих разделах:

См. также

Задачи

Практическое руководство. Работа с настройкой ленты

Пошаговое руководство. Создание настраиваемой вкладки с помощью конструктора лент

Практическое руководство. Изменение положения вкладки на ленте

Практическое руководство. Настройка встроенной вкладки

Практическое руководство. Добавление элементов управления в представление Backstage

Практическое руководство. Экспорт лент из конструктора лент в XML-ленты

Практическое руководство. Просмотр ошибок пользовательского интерфейса надстройки

Основные понятия

Доступ к ленте во время выполнения

Конструктор лент

Общие сведения об объектной модели ленты

Настройка ленты для Outlook

Другие ресурсы

Обзор ленты

Language-integrated query (LINQ)