Пошаговое руководство. Добавление элементов управления в лист во время выполнения в проекте уровня приложения
Можно добавлять элементы управления на любой открытый лист при помощи надстройки Excel.В данном пошаговом руководстве демонстрируется, как с помощью ленты предоставить пользователям возможность добавлять на лист элементы управления Button, NamedRange и ListObject.Дополнительные сведения см. в разделе Добавление элементов управления в документы Office во время выполнения.
Сведения в этом разделе Применяется. применяется к проектам уровня приложения для Excel 2010.Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.
В данном пошаговом руководстве рассмотрены следующие задачи:
Предоставление пользовательского интерфейса для добавления элементов управления на лист.
Добавление элементов управления на лист.
Удаление элементов управления из листа.
Примечание |
---|
На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Обязательные компоненты
Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.
-
Выпуск Visual Studio 2012, включающий инструменты разработчика Microsoft Office. Дополнительные сведения см. в разделе [Настройка компьютера для разработки решений Office](bb398242\(v=vs.110\).md).
- Excel 2013 или Excel 2010.
Создание нового проекта надстройки Excel
Начните с создания проекта надстройки для Excel.
Создание нового проекта надстройки Excel
В Visual Studio создайте проект надстройки Excel с именем ExcelDynamicControls.Дополнительные сведения см. в разделе Практическое руководство. Создание проектов Office в Visual Studio.
Добавьте ссылку на сборку Microsoft.Office.Tools.Excel.v4.0.Utilities.dll.Эта ссылка необходима для программного добавления элемента управления Windows Forms в лист на последующих этапах.
Предоставление пользовательского интерфейса для добавления элементов управления на лист
Добавьте пользовательскую вкладку на ленту Excel.Пользователи смогут устанавливать флажки на этой вкладке для добавления элементов управления на лист.
Предоставление пользовательского интерфейса для добавления элементов управления на лист
В меню Проект выберите команду Добавить новый элемент.
В диалоговом окне Добавление нового элемента выберите Лента (визуальный конструктор) и нажмите кнопку Добавить.
В конструкторе лент откроется файл с именем Ribbon1.cs или Ribbon1.vb, а также отобразится вкладка по умолчанию и группа.
Перетащите элемент управления "Флажок" с вкладки Элементы управления ленты Office в панели элементов в группу group1.
Щелкните CheckBox1, чтобы выбрать его.
В окне Свойства измените следующие свойства:
Свойство
Значение
Имя
Кнопка
Метка
Кнопка
Добавьте второй флажок в group1 и измените следующие свойства.
Свойство
Значение
Имя
NamedRange
Метка
NamedRange
Добавьте третий флажок в group1 и измените следующие свойства.
Свойство
Значение
Имя
ListObject
Метка
ListObject
Добавление элементов управления на лист
Управляемые элементы управления можно добавлять только к ведущим элементам, действующим как контейнеры.Поскольку проекты надстроек работают с любым открытым листом, прежде чем добавить элемент управления, надстройка преобразовывает лист в ведущий элемент либо получает существующий ведущий элемент.Добавьте код в обработчик событий нажатия каждого элемента управления, чтобы создать ведущий элемент Worksheet на основе открытого листа.Затем добавьте элементы управления Button, NamedRange и ListObject в текущую выбранную область листа.
Добавление элементов управления на лист
В конструкторе ленты дважды щелкните элемент Button.
В редакторе кода откроется обработчик событий Click элемента Button.
Замените обработчик событий Button_Click следующим кодом.
Этот код использует метод GetVstoObject для получения ведущего элемента, представляющего первый лист в книге, а затем добавляет элемент управления Button в выбранную ячейку.
Private Sub Button_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles Button.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim buttonName As String = "MyButton" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then Dim button As New Microsoft.Office.Tools.Excel.Controls.Button() worksheet.Controls.AddControl(button, selection, buttonName) End If Else worksheet.Controls.Remove(buttonName) End If End Sub
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); } }
В обозревателе решений выберите файл Ribbon1.cs или Ribbon1.vb.
В меню Вид выберите Конструктор.
В конструкторе ленты дважды щелкните элемент NamedRange.
Замените обработчик событий NamedRange_Click следующим кодом.
Этот код использует метод GetVstoObject для получения ведущего элемента, представляющего первый лист в книге, а затем задает элемент управления NamedRange для выбранной ячейки или ячеек.
Private Sub NamedRange_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles NamedRange.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim rangeName As String = "MyNamedRange" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then Dim namedRange As NamedRange = _ worksheet.Controls.AddNamedRange(selection, rangeName) End If Else worksheet.Controls.Remove(rangeName) End If End Sub
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); } }
В конструкторе ленты дважды щелкните элемент ListObject.
Замените обработчик событий ListObject_Click следующим кодом.
Этот код использует метод GetVstoObject для получения ведущего элемента, представляющего первый лист в книге, а затем задает элемент управления ListObject для выбранной ячейки или ячеек.
Private Sub ListObject_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles ListObject.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim listObjectName As String = "MyListObject" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = _ Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then worksheet.Controls.AddListObject(selection, listObjectName) End If Else worksheet.Controls.Remove(listObjectName) End If End Sub
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); } }
Добавьте следующие инструкции в начало файла кода ленты.
Imports Excel = Microsoft.Office.Interop.Excel Imports Microsoft.Office.Tools.Excel Imports Microsoft.Office.Tools.Excel.Extensions
using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Tools.Excel; using Microsoft.Office.Tools.Excel.Extensions;
Удаление элементов управления из листа
При сохранении и закрытии листа элементы управления не сохраняются.Следует удалить программными средствами все созданные элементы управления Windows Forms перед сохранением листа, в противном случае при повторном открытии этого листа появится только контур этого элемента управления.Добавьте в событие WorkbookBeforeSave код, который удаляет элементы управления Windows Forms из коллекции созданного ведущего элемента.Дополнительные сведения см. в разделе Сохранение динамических элементов управления в документах Office.
Удаление элементов управления из листа
В обозревателе решений выберите файл ThisAddIn.cs или ThisAddIn.vb.
В меню Вид выберите пункт Код.
Добавьте следующий метод в класс ThisAddIn.Этот код получает первый лист книги, а затем с помощью метода HasVstoObject проверяет, имеется ли на этом листе созданный объект листа.Если созданный объект листа имеет элементы управления, то код получает этот объект и выполняет итерацию по коллекции элементов управления, удаляя элементы управления один за другим.
Sub Application_WorkbookBeforeSave _ (ByVal workbook As Microsoft.Office.Interop.Excel.Workbook, _ ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) _ Handles Application.WorkbookBeforeSave Dim worksheet As Excel.Worksheet = workbook.Worksheets(1) If Globals.Factory.HasVstoObject(worksheet) And Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0 Then Dim vstoWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet) While vstoWorksheet.Controls.Count > 0 Dim vstoControl As Object = vstoWorksheet.Controls(0) vstoWorksheet.Controls.Remove(vstoControl) End While End If End Sub
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); } } }
В 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); }
Проверка работы решения
Добавьте на лист элементы управления, выбрав их в пользовательской вкладке на ленте.При сохранении листа эти элементы управления будут удалены.
Проверка решения.
Нажмите клавишу F5 для запуска проекта.
Выберите какую-либо ячейку в листе Sheet1.
Щелкните вкладку Надстройки.
В группе group1 щелкните элемент Button.
В выбранной ячейке появится кнопка.
Выберите другую ячейку в листе Sheet1.
В группе group1 щелкните элемент NamedRange.
Для выбранной ячейки будет задан именованный диапазон.
Выберите ряд ячеек в листе Sheet1.
В группе group1 щелкните элемент ListObject.
В выбранные ячейки будет добавлен список.
Сохраните лист.
Элементы управления, добавленные в Sheet1, более не появляются.
Следующие действия
Дополнительные сведения об элементах управления в проектах надстроек Excel см. в следующем разделе:
- Дополнительные сведения о сохранении элементов управления на листе см. в примере динамических элементов управления в надстройке Excel, который содержится в разделе Образцы и пошаговые руководства разработки Office.
См. также
Основные понятия
Общие сведения об использовании элементов управления Windows Forms в документах Office