宿主项和宿主控件的编程限制

更新: 2008 年 7 月

适用于

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

文档级项目

  • Excel 2003

  • Excel 2007

  • Word 2003

  • Word 2007

应用程序级项目

  • Excel 2007

  • Word 2007

有关更多信息,请参见按应用程序和项目类型提供的功能

每一个宿主项和宿主控件的行为都设计为与相应的本机 Microsoft Office Word 或 Microsoft Office Excel 对象的行为相似,并且提供了附加功能。但是,在运行时宿主项和宿主控件的行为与本机 Office 对象的行为存在一些根本差异。

有关宿主项和宿主控件的一般信息,请参见宿主项和宿主控件概述

以编程方式创建宿主项

以编程方式在运行时创建或打开文档、工作簿或工作表时,相应的项不是宿主项。实际上,新对象是本机 Office 对象。例如,如果使用 Add 方法在运行时创建新的 Word 文档,该新文档将是本机 Microsoft.Office.Interop.Word.Document 对象,而不是 Microsoft.Office.Tools.Word.Document 宿主项。同样,使用 Add 方法在运行时创建新的工作簿时,您会得到本机 Microsoft.Office.Interop.Excel.Worksheet 对象,而不是 Microsoft.Office.Tools.Excel.Worksheet 宿主项。

在文档级项目中,不能在运行时创建宿主项。在文档级项目中,只能在设计时创建宿主项。有关更多信息,请参见文档宿主项工作簿宿主项工作表宿主项

从 Visual Studio 2008 Service Pack 1 (SP1) 开始,在 Excel 2007 和 Word 2007 的应用程序级外接程序中,您可以在运行时创建 Microsoft.Office.Tools.Word.DocumentMicrosoft.Office.Tools.Excel.WorkbookMicrosoft.Office.Tools.Excel.Worksheet 宿主项。有关更多信息,请参见在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿

以编程方式创建宿主控件

可以通过编程方式在运行时向 Microsoft.Office.Tools.Word.DocumentMicrosoft.Office.Tools.Excel.Worksheet 宿主项添加宿主控件。有关更多信息,请参见在运行时向 Office 文档添加控件

不能向本机 Microsoft.Office.Interop.Word.DocumentMicrosoft.Office.Interop.Excel.Worksheet 添加宿主控件。

说明:

不能以编程方式将下列宿主控件添加到工作表或文档中:XmlMappedRangeXMLNodeXMLNodes

了解宿主项、宿主控件与本机 Office 对象之间的类型差异

对于每一个宿主项和宿主控件,都有一个基础本机 Microsoft Office Word 或 Microsoft Office Excel 对象与之对应。可以使用宿主项或宿主控件的 InnerObject 属性访问基础对象。但是,无法将本机 Office 对象强制转换为与之对应的宿主项或宿主控件。如果试图将本机 Office 对象强制转换为宿主项或宿主控件的类型,将引发 InvalidCastException

在有些情况下,宿主项和宿主控件的类型与基础本机 Office 对象之间的差异可能影响您的代码。

将宿主控件传递给方法和属性

在 Word 中,不能将宿主控件传递给需要将本机 Word 对象作为参数的方法或属性。必须使用宿主控件的 InnerObject 属性来返回基础本机 Word 对象。例如,可以通过将 Microsoft.Office.Tools.Word.Bookmark 宿主控件的 InnerObject 属性传递给方法,将 Microsoft.Office.Interop.Word.Bookmark 对象传递给方法。

在 Excel 中,有两种情况您必须使用宿主控件的 InnerObject 属性:

  • 当方法或属性需要基础 Excel 对象时。

  • ExcelLocale1033Attribute 属性 (Attribute) 设置为 false 并且方法或属性 (Property) 需要 Object 而不是基础 Excel 对象时。

下面的示例创建一个 Microsoft.Office.Tools.Excel.NamedRange 控件,并将其传递给 AutoFill 方法。代码使用命名范围的 InnerObject 属性返回 AutoFill 方法所需的基础 Office Microsoft.Office.Interop.Excel.Range

Me.Range("A1").Value2 = "Monday"
Me.Range("A2").Value2 = "Tuesday"

Dim dayRange As Microsoft.Office.Tools.Excel.NamedRange = _
    Me.Controls.AddNamedRange(Me.Range("A1", "A7"), "dayRange")

Me.Range("A1", "A2").AutoFill(dayRange.InnerObject, Excel.XlAutoFillType.xlFillDays)
this.Range["A1", missing].Value2 = "Monday";
this.Range["A2", missing].Value2 = "Tuesday";

Microsoft.Office.Tools.Excel.NamedRange dayRange 
    = this.Controls.AddNamedRange(this.Range["A1", "A7"], "dayRange");

this.Range["A1", "A2"].AutoFill(dayRange.InnerObject, Excel.XlAutoFillType.xlFillDays);

本机 Office 对象和属性的返回类型

宿主项的大部分方法和属性会返回它所基于的基础本机 Office 对象。例如,Excel 中的 NamedRange 宿主控件的 Parent 属性会返回 Microsoft.Office.Interop.Excel.Worksheet 对象,而非 Microsoft.Office.Tools.Excel.Worksheet 宿主项。同样,Word 中的 RichTextContentControl 宿主控件的 Parent 属性会返回 Microsoft.Office.Interop.Word.Document 对象,而非 Microsoft.Office.Tools.Word.Document 宿主项。

访问宿主控件的集合

Visual Studio Tools for Office 不会为每种类型的宿主控件提供单独的集合。例如,不可能使用 Microsoft.Office.Interop.Word.Bookmarks 集合枚举文档中的每个 Microsoft.Office.Tools.Word.Bookmark 控件。Microsoft.Office.Interop.Word.Bookmarks 集合包括文档中的所有书签;它不区分 Microsoft.Office.Tools.Word.Bookmark 控件和 Microsoft.Office.Interop.Word.Bookmark

您可以使用 Worksheet.ControlsDocument.Controls 属性来循环访问文档或工作簿中的所有控件(包括宿主控件和 Windows 窗体控件),然后查找与您感兴趣的宿主控件类型相匹配的项。下面的代码示例检测某个 Word 文档中的每一个控件,确定它们是否为 Microsoft.Office.Tools.Word.Bookmark

Dim targetControl As Object
For Each targetControl In Me.Controls

    If TypeOf (targetControl) Is Microsoft.Office.Tools.Word.Bookmark Then
        Dim bookMark As Microsoft.Office.Tools.Word.Bookmark = _
            CType(targetControl, Microsoft.Office.Tools.Word.Bookmark)

        ' Do some work with the book mark here.
    End If
Next
foreach (object targetControl in this.Controls)
{
    Microsoft.Office.Tools.Word.Bookmark bookMark = 
        targetControl as Microsoft.Office.Tools.Word.Bookmark;

    if (bookMark != null)
    {
        // Do some work with the book mark here.
    }
}

请参见

概念

宿主项和宿主控件概述

工作表宿主项

工作簿宿主项

文档宿主项

参考

Worksheet.Controls

Document.Controls

其他资源

Word 宿主控件

Excel 宿主控件

修订记录

日期

修订历史记录

原因

2008 年 7 月

增加了有关使用应用程序级外接程序创建宿主项的信息。

SP1 功能更改。