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


Получение вложенных объектов из собственных объектов Office в настройках уровня документа

Многие обработчики событий для событий Office получают собственные объекты Office, представляющие рабочую книгу, лист или документ, инициирующий событие. В некоторых случаях может возникнуть необходимость в выполнении определенного кода только в том случае, если рабочая книга или документ в настройке уровня документа инициирует событие. Например, в настройке уровня документа для Excel может возникнуть необходимость в выполнении определенного кода, когда пользователь активирует один из листов в настраиваемой книге, но не тогда, когда пользователь активирует рабочий лист в какой-либо книге, которая в это же время оказывается открытой.

При наличии собственного объекта Office можно проверить, был ли объект расширен до ведущего элемента или ведущего элемента управления в настройке уровня документа. Ведущие элементы и элементы управления ведущего приложения являются типами, предоставляемыми средой Среда выполнения Visual Studio Tools for Office и добавляющими функциональные возможности объектам, существующим внутри объектных моделей Word или Excel (называемых собственными объектами Office). Собирательно ведущие элементы и элементы управления ведущего приложения также называются расширенными объектами. Дополнительные сведения об этих элементах см. в разделе Общие сведения о ведущих элементах и элементах управления ведущего приложения.

Применение. Сведения этого раздела применяются к проектам уровня документа для следующих приложений: Excel 2007 и Excel 2010; Word 2007 и Word 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.

Основные сведения о методах GetVstoObject и HasVstoObject

Чтобы проверить собственный объект Office, необходимо использовать методы HasVstoObject и GetVstoObject в проекте.

  • Если необходимо определить, имеет ли собственный объект Office расширенный объект в текущей настройке, используйте метод HasVstoObject. Этот метод возвращает true, если собственный объект Office имеет расширенный объект, и false, если нет.

  • Если нужно получить расширенный объект для собственного объекта Office, используйте метод GetVstoObject. Этот метод возвращает объект Microsoft.Office.Tools.Excel.ListObject, Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet или Microsoft.Office.Tools.Word.Document, если таковой имеется в заданном собственном объекте Office. В противном случае GetVstoObject возвращает null. Например, метод GetVstoObject возвращает объект Microsoft.Office.Tools.Word.Document, если заданный объект Microsoft.Office.Interop.Word.Document, является основным объектом для документа в текущем проекте документа Word.

В проектах уровня документа нельзя использовать метод GetVstoObject для создания нового ведущего элемента Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet или Microsoft.Office.Tools.Word.Document во время выполнения. Этот метод можно использовать только для доступа к существующим ведущим элементам, созданным в текущем проекте во время выполнения. Если требуется создать во время выполнения новые ведущие элементы, необходимо построить проект уровня приложения. Дополнительные сведения см. в разделах Программные ограничения ведущих элементов и элементов управления ведущего приложения и Расширение документов Word и книг Excel в надстройках уровня приложения во время выполнения.

Использование методов GetVstoObject и HasVstoObject

Способ вызова методов HasVstoObject и GetVstoObject зависит от версии платформы .NET Framework, на которую ориентирован проект:

Примечание

Чтобы использовать методы GetVstoObject и HasVstoObject в проектах уровня документа, ориентированных на .NET Framework 3.5, необходимо добавить оператор using (для C#) или Imports (для Visual Basic) для пространств имен Microsoft.Office.Tools.Excel.Extensions или Microsoft.Office.Tools.Word.Extensions в начало файла кода.Методы GetVstoObject и HasVstoObject реализованы как методы расширения, и указанные операторы позволяют вызывать эти методы.

Пример. Определение, инициировано ли событие ведущим элементом

В следующих примерах кода демонстрируются методы HasVstoObject и GetVstoObject. Оба примера обрабатывают событие SheetActivate класса ThisWorkbook в проекте книги Excel. Первый пример определяет, были ли активирован один из ведущих элементов Microsoft.Office.Tools.Excel.Worksheet, сопоставляя параметр Sh со свойством InnerObject каждого ведущего элемента по умолчанию.

Sub ThisWorkbook_SheetActivate1(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing

    If Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet1.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3.Base
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate1(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;

    if (Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet1.Base;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2.Base;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3.Base;

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

Следующий пример упрощает этот процесс, используя методы HasVstoObject и GetVstoObject параметра Sh. В этом примере показан вызов этих методов в проекте, ориентированном на .NET Framework 4.

Private Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object)
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso
        Globals.Factory.HasVstoObject(interopWorksheet) Then
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet)
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here. 
    End If

End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet =
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && Globals.Factory.HasVstoObject(interopWorksheet))
    {
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet);
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

В примере ниже показана та же задача в проекте, ориентированном на .NET Framework 3.5.

Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet = _
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso _
        interopWorksheet.HasVstoObject() Then
        vstoWorksheet = interopWorksheet.GetVstoObject()
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet = 
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && interopWorksheet.HasVstoObject())
    {
        vstoWorksheet = interopWorksheet.GetVstoObject();
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

См. также

Ссылки

Методы расширения (Руководство по программированию в C#)

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

Общие сведения о ведущих элементах и элементах управления ведущего приложения

Расширение документов Word и книг Excel в надстройках уровня приложения во время выполнения

Методы расширения (Visual Basic)

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

Настройки программирования уровня документа