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

每个宿主项和宿主控件的行为都类似于相应的本机 Microsoft Office Word 或 Microsoft Office Excel 对象,并且具有附加功能。 但是,在运行时宿主项和宿主控件的行为与本机 Office 对象之间存在一些本质区别。

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

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

以编程方式创建主机项

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

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

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

以编程方式创建主机控件

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

不能向本机 DocumentWorksheet添加宿主控件。

注意

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

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

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

有几种应用场景,宿主项和宿主控件的类型与基础本机 Office 对象之间的差异可能会影响你的代码。

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

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

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

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

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 对象。 例如,Excel 中 Parent 宿主控件的 NamedRange 属性将返回 Worksheet 对象而不是 Worksheet 宿主项。 同样,Word 中 Parent 宿主控件的 RichTextContentControl 属性也将返回 Document 对象而不是 Document 宿主项。

访问主机控件的集合

Visual Studio Tools for 办公室 运行时不提供每种主机控件的单个集合。 相反,使用宿主项的 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 属性的详细信息,请参阅在运行时向办公室文档添加控件。

Word 和 Excel 对象模型包括公开文档和工作表中本机控件的集合的属性。 不能使用这些属性来访问托管控件。 例如,不能使用 BookmarkBookmarks 属性或 DocumentBookmarks 属性来枚举文档中的每个 Document宿主控件。 这些属性仅包括文档中的 Bookmark 控件;不包括文档中的 Bookmark 宿主控件。