主机项和主机控件的编程限制
每个宿主项和宿主控件的行为都类似于相应的本机 Microsoft Office Word 或 Microsoft Office Excel 对象,并且具有附加功能。 但是,在运行时宿主项和宿主控件的行为与本机 Office 对象之间存在一些本质区别。
有关主机项和主机控件的一般信息,请参阅 主机项和主机控件概述。
适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目和 VSTO 外接程序项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。
以编程方式创建主机项
使用 Word 或 Excel 对象模型在运行时以编程方式创建或打开文档、工作簿或工作表时,该项不是宿主项。 相反,新的对象是本机 Office 对象。 例如,如果使用 Add 方法在运行时创建新的 Word 文档,它将是一个本机 Document 对象而不是 Document 宿主项。 同样,当你使用 Add 方法在运行时创建新工作表时,会得到本机 Worksheet 对象而不是 Worksheet 宿主项。
在文档级项目中,不能在运行时创建宿主项。 在文档级项目中,只能在设计时创建宿主项。 有关详细信息,请参阅 文档宿主项、 工作簿宿主项和 工作表宿主项。
在 VSTO 外接程序项目中,可以在运行时创建 Document、 Workbook或 Worksheet 宿主项。 有关详细信息,请参阅 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿。
以编程方式创建主机控件
可以在运行时以编程方式向 Document 或 Worksheet 宿主项添加宿主控件。 有关详细信息,请参阅在运行时向办公室文档添加控件。
不能向本机 Document 或 Worksheet添加宿主控件。
注意
不能以编程方式向工作表或文档添加以下宿主控件: XmlMappedRange、 XMLNode和 XMLNodes。
了解主机项、主机控件和本机办公室对象之间的类型差异
对于每个宿主项和宿主控件,都有基础本机 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 对象模型包括公开文档和工作表中本机控件的集合的属性。 不能使用这些属性来访问托管控件。 例如,不能使用 Bookmark 的 Bookmarks 属性或 Document 的 Bookmarks 属性来枚举文档中的每个 Document宿主控件。 这些属性仅包括文档中的 Bookmark 控件;不包括文档中的 Bookmark 宿主控件。