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

每个主机项和主机控件的设计方式使其行为类似于相应的 Microsoft Office Word 或 Microsoft Office Excel 本机对象,并具有附加功能。 但是,在运行时主机项和主机控件和本机 Office 对象的行为之间存在一些根本差异。

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

适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目和 VSTO 外接程序项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能

以编程方式创建主机项

使用 Word 或 Excel 对象模型以编程方式在运行时创建或打开文档、工作簿或工作表时,该项不是宿主项。 相反,新对象是原生 Office 对象。 例如,如果使用 Add 该方法在运行时创建新的 Word 文档,它将是本机 Document 对象而不是 Document 宿主项。 同样,在运行时使用 Add 方法创建新工作表时,会得到一个本机 Worksheet 对象,而不是 Worksheet 宿主对象。

在文档级项目中,无法在运行时创建主机项。 只能在文档级项目的设计时创建宿主项。 有关详细信息,请参阅 文档宿主项工作簿宿主项工作表宿主项

在 VSTO 外接程序项目中,可以在运行时创建 DocumentWorkbookWorksheet 托管项。 有关详细信息,请参阅 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿

以编程方式创建主机控件

可以在运行时以编程方式将主机控件添加到 DocumentWorksheet 宿主项。 有关详细信息,请参阅 运行时向 Office 文档添加控件

不能将主机控件添加到本机 DocumentWorksheet.

注释

无法以编程方式将以下主机控件添加到工作表或文档:XmlMappedRange以及XMLNodeXMLNodes

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

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

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

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

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

在 Excel 中,当方法或属性需要基础 Excel 对象时,必须使用主机控件的 InnerObject 属性将主机控件传递给方法或属性。

以下示例创建一个 NamedRange 控件并将其传递给 AutoFill 该方法。 该代码使用命名范围的InnerObject属性来返回AutoFill方法所需的基础 OfficeRange

this.Range["A1"].Value2 = "Monday";
this.Range["A2"].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 对象。 例如, Parent Excel 中主机控件的属性 NamedRange 返回对象 Worksheet 而不是 Worksheet 宿主项。 同样, Parent Word 中主机控件的属性 RichTextContentControl 返回对象 Document 而不是 Document 宿主项。

访问主机控件的集合

Visual Studio Tools for Office 运行时不提供每种主机控件的单个集合。 而是使用宿主项的 Controls 属性循环访问文档或工作表上的所有托管控件(主机控件和 Windows 窗体控件),然后查找与你感兴趣的主机控件类型匹配的项目。 下面的代码示例检查 Word 文档上的每个控件,并确定该控件是否为控件 Bookmark

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 bookmark here.
    }
}

有关主机项的 Controls 属性的详细信息,请参阅 运行时向 Office 文档添加控件

Word 和 Excel 对象模型包括使文档和工作表上的内置控件集合得以访问的属性。 无法使用这些属性访问托管控件。 例如,无法通过使用 DocumentBookmarks 属性或 DocumentBookmarks 属性来枚举文档中的每个 Bookmark 主机控件。 文档中的这些属性仅包含 Bookmark 控件;它们不包含文档中的 Bookmark 宿主控件。