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


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

Вы можете добавить элементы управления на любой открытый лист с помощью надстройки VSTO для Excel. В этом пошаговом руководстве показано, как с помощью ленты предоставить пользователям возможность добавлять Button, NamedRange и ListObject на лист. Дополнительные сведения см. в разделе "Добавление элементов управления в документы Office во время выполнения".

Область применения. Сведения в этом разделе относятся к проектам надстроек VSTO для Excel. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.

В этом пошаговом руководстве рассматриваются следующие задачи:

  • предоставление пользовательского интерфейса для добавления элементов управления на лист;

  • добавление элементов управления на лист;

  • удаление элементов управления с листа.

    Примечание.

    Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Необходимые компоненты

Для выполнения этого пошагового руководства требуются следующие компоненты:

Создание проекта надстройки VSTO в Excel

Для начала создайте проект надстройки VSTO для Excel.

Создание проекта надстройки VSTO для Excel

  1. В Visual Studio создайте проект надстройки VSTO Excel с именем ExcelDynamicControls. Дополнительные сведения см. в разделе How to: Create Office Projects in Visual Studio.

  2. Добавьте ссылку на сборку Microsoft.Office.Tools.Excel.v4.0.Utilities.dll . Эта ссылка потребуется для программного добавления элемента управления Windows Forms на лист далее в этом пошаговом руководстве.

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

Добавьте настраиваемую вкладку на ленту Excel. Пользователи могут установить флажки на вкладке, чтобы добавить элементы управления на лист.

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

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

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

    Файл с именем Ribbon1.cs или Ribbon1.vb открывается в конструкторе лент и отображает вкладку и группу по умолчанию.

  3. На вкладке "Элементы управления лентой Office" на панели элементов перетащите элемент управления CheckBox в группу 1.

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

  5. В окне Свойства измените следующие свойства.

    Свойство Значение
    Имя Кнопка
    Подпись Кнопка
  6. Добавьте второй флажок в group1, а затем измените следующие свойства.

    Свойство Значение
    Имя Namedrange
    Подпись Namedrange
  7. Добавьте третье поле проверка в группу 1, а затем измените следующие свойства.

    Свойство Значение
    Имя Listobject
    Подпись Listobject

Добавление элементов управления на лист

Управляемые элементы управления можно добавить только в ведущие элементы, которые служат контейнерами. Поскольку проекты надстроек VSTO работают с любой открытой книгой, надстройка VSTO преобразует лист в ведущий элемент или получает существующий ведущий элемент перед добавлением элемента управления. Добавьте код в обработчик событий нажатием каждого элемента управления, чтобы создать ведущий элемент Worksheet, основанный на открытом листе. Затем добавьте Button, NamedRange и ListObject в выделенный фрагмент на листе.

Добавление элементов управления на лист

  1. В конструкторе ленты дважды щелкните кнопку.

    Откроется Click обработчик событий проверка кнопки в редакторе кода.

  2. Замените обработчик событий Button_Click следующим кодом.

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

    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        
        string buttonName = "MyButton";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                Microsoft.Office.Tools.Excel.Controls.Button button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
    
  3. В Обозреватель решений выберите Ribbon1.cs или Ribbon1.vb.

  4. В меню "Вид" нажмите кнопку "Конструктор".

  5. В конструкторе ленты дважды щелкните NamedRange.

  6. Замените обработчик событий NamedRange_Click следующим кодом.

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

    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string Name = "MyNamedRange";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddNamedRange(selection, Name);
            }
        }
        else
        {
            worksheet.Controls.Remove(Name);
        }
    }
    
  7. В конструкторе ленты дважды щелкните ListObject.

  8. Замените обработчик событий ListObject_Click следующим кодом.

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

    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string listObjectName = "MyListObject";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddListObject(selection, listObjectName);
            }
        }
        else
        {
            worksheet.Controls.Remove(listObjectName);
        }
    }
    
  9. Добавьте следующие операторы в начало файла кода ленты.

    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Tools.Excel;
    using Microsoft.Office.Tools.Excel.Extensions;
    

Удаление элементов управления с листа

Элементы управления не сохраняются при сохранении и закрытии листа. Все созданные элементы управления Windows Forms следует удалить программными средствами до сохранения листа, при этом только контур элемента управления появится при повторном открытии книги. Добавьте код в событие WorkbookBeforeSave, которое удаляет элементы управления Windows Forms из коллекции элементов управления созданного ведущего элемента управления. Дополнительные сведения см. в статье "Сохранение динамических элементов управления в документах Office".

Удаление элементов управления с листа

  1. В Обозреватель решений выберите ThisAddIn.cs или ThisAddIn.vb.

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

  3. Добавьте приведенный ниже метод в класс ThisAddIn. Этот код получает первый лист в книге, а затем использует метод HasVstoObject, чтобы проверить, содержит ли лист созданный объект листа. Если созданный объект листа содержит элементы управления, код получает его и проходит по коллекции элементов управления, удаляя элементы управления.

           void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
               bool SaveAsUI, ref bool Cancel)
           {
               Excel.Worksheet worksheet =
                   workbook.Worksheets[1] as Excel.Worksheet;
               
               if (Globals.Factory.HasVstoObject(worksheet) && 
                   Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
               {
                   Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
               
              
                   
                   while (vstoWorksheet.Controls.Count > 0)
                   {
                       object vstoControl = vstoWorksheet.Controls[0];
                       vstoWorksheet.Controls.Remove(vstoControl);
                   }
    
               }
           }
    
  4. В C# необходимо создать обработчик для события WorkbookBeforeSave. Этот код можно поместить в методе ThisAddIn_Startup. Дополнительные сведения о создании обработчиков событий см. в статье "Практическое руководство. Создание обработчиков событий в проектах Office". Замените метод ThisAddIn_Startup приведенным ниже кодом.

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeSave += 
            new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
                (Application_WorkbookBeforeSave);
    }
    

Тестирование решения

Добавьте элементы управления на лист, выбрав их на пользовательской вкладке на ленте. При сохранении листа эти элементы управления будут удалены.

Тестирование решения

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

  2. Выберите любую ячейку на листе Sheet1.

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

  4. В группе group1 нажмите кнопку .

    В выбранной ячейке появится кнопка.

  5. Выберите другую ячейку на листе Sheet1.

  6. В группе group1 щелкните NamedRange.

    Именованный диапазон будет определен для выбранной ячейки.

  7. Выберите ряд ячеек на листе Sheet1.

  8. В группе group1 щелкните ListObject.

    Объект списка будет добавлен для выделенных ячеек.

  9. Сохраните лист.

    Элементы управления, добавленные в Sheet1, больше не отображаются.

Следующие шаги

Дополнительные сведения об элементах управления в проектах надстройки VSTO для Excel см. в следующем разделе: