宿主项和宿主控件概述

宿主项和宿主控件是一些类型,用于帮助为使用 Visual Studio 中的 Office 开发工具创建的 Office 解决方案提供编程模型。 宿主项和宿主控件使得与基于 COM 的 Microsoft Office Word 和 Microsoft Office Excel 对象模型进行交互更像与托管对象(如 Windows 窗体控件)进行交互。

**适用于:**本主题中的信息适用于以下应用程序的文档级项目和应用程序级项目:Excel 2007 和 Excel 2010;Word 2007 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

宿主项

宿主项是 Office 项目中位于对象模型层次结构顶层的类型。 Visual Studio Tools for Office Runtime为 Word 和 Excel 解决方案定义以下宿主项:

其中的每个类型都扩展一个本身存在于 Word 或 Excel 对象模型中的对象(称为“本机 Office 对象”)。 例如,Microsoft.Office.Tools.Word.Document 宿主项扩展 Microsoft.Office.Interop.Word.Document 对象,该对象在 Word 的主互操作程序集中定义。

宿主项通常与对应的 Office 对象具有相同的基本功能,但是它们具有以下增强功能:

  • 能够承载托管控件(包括宿主控件和 Windows 窗体控件)。

  • 事件模型更加丰富。 本机 Word 和 Excel 对象模型中的某些文档、工作簿和工作表事件仅在应用程序级引发。 宿主项在文档级提供这些事件,这样更便于处理特定文档的事件。

了解文档级项目中的宿主项

在文档级项目中,宿主项为代码提供入口点,而且具有可帮助您开发解决方案的设计器。

Microsoft.Office.Tools.Word.DocumentMicrosoft.Office.Tools.Excel.Worksheet 宿主项拥有的关联设计器是文档或工作表的可视化表示形式,与 Windows 窗体设计器相似。 使用此设计器,可以直接在 Word 或 Excel 中修改文档或工作表的内容,还可以将控件拖到设计图面上。 有关更多信息,请参见文档宿主项工作表宿主项

Microsoft.Office.Tools.Excel.Workbook 宿主项不充当具有用户界面的控件的容器。 此宿主项的设计器充当一个组件栏,使您能够将诸如 DataSet 这样的组件拖到它的设计图面上。 有关更多信息,请参见工作簿宿主项

在文档级项目中,不能以编程方式创建宿主项。 请改用 Visual Studio 在设计时自动在项目中生成的 ThisDocument、ThisWorkbook 或 Sheetn 类。 所生成的这些类派生自宿主项,它们为您的代码提供入口点。 有关更多信息,请参见宿主项和宿主控件的编程限制

了解应用程序级项目中的宿主项

默认情况下,当您创建应用程序级外接程序时,您无权访问任何宿主项。 但是,您可以在运行时在 Word 和 Excel 外接程序中生成 Microsoft.Office.Tools.Word.DocumentMicrosoft.Office.Tools.Excel.WorkbookMicrosoft.Office.Tools.Excel.Worksheet 宿主项。

生成宿主项之后,可以执行多项任务,例如,向文档中添加控件以及创建能够在特定文档中识别的智能标记。 有关更多信息,请参见在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿

提示

在 Excel 2010 和 Word 2010 中已弃用智能标记。 有关更多信息,请参见智能标记概述

宿主控件

宿主控件扩展 Word 和 Excel 对象模型中的各个用户界面 (UI) 对象,例如 Microsoft.Office.Interop.Word.ContentControlMicrosoft.Office.Interop.Excel.Range 对象。

对于 Excel 项目,可以使用以下宿主控件:

对于 Word 项目,可以使用以下宿主控件:

添加到 Office 文档中的宿主控件的行为与本机 Office 对象的行为类似;但宿主控件还拥有其他功能,包括事件和数据绑定功能。 例如,要捕获 Excel 中本机 Microsoft.Office.Interop.Excel.Range 对象的事件,必须首先处理工作表的更改事件。 然后必须确定 Microsoft.Office.Interop.Excel.Range 中是否发生了更改。 相反,Microsoft.Office.Tools.Excel.NamedRange 宿主控件具有可直接处理的 Change 事件。

宿主项和宿主控件之间的关系与 Windows 窗体和 Windows 窗体控件之间的关系非常相似。 就像在 Windows 窗体上放置文本框控件一样,您可以在 Microsoft.Office.Tools.Excel.Worksheet 宿主项上放置 Microsoft.Office.Tools.Excel.NamedRange 控件。 下图显示了宿主项和宿主控件之间的关系。

宿主项与宿主控件之间的关系

还可以将 Windows 窗体控件直接添加到 Word 和 Excel 文档图面中,从而可以在 Office 解决方案中使用 Windows 窗体控件。 有关更多信息,请参见 Office 文档上的 Windows 窗体控件概述

提示

不支持向 Word 子文档添加宿主控件或 Windows 窗体控件。

将宿主控件添加到文档中

在文档级项目中,可以按照以下方式在设计时向 Word 文档或 Excel 工作表中添加宿主控件:

  • 采用与添加本机对象相同的方式,在设计时向文档中添加宿主控件。

  • 将宿主控件从**“工具箱”拖到文档和工作表上。 Excel 宿主控件可从 Excel 项目的“Excel 控件”选项卡中得到,而 Word 宿主控件可在 Word 项目的“Word 控件”**选项卡中得到。

  • 将宿主控件从**“数据源”**窗口拖到文档和工作表上。 这样,您将能够添加已与数据绑定的控件。 有关更多信息,请参见将数据绑定到 Office 解决方案中的控件

在文档级项目和应用程序级项目中,还可以在运行时向文档中添加一些宿主控件。 有关更多信息,请参见在运行时向 Office 文档添加控件

有关如何向文档中添加宿主控件的更多信息,请参见以下主题:

为宿主控件命名

将某个宿主控件从**“工具箱”拖到文档中时,该控件将自动用控件类型来命名,末尾带有递增的编号。 例如,书签将命名为 Bookmark1、Bookmark2,依此类推。 如果使用 Word 或 Excel 的本机功能添加控件,则可以在创建控件时为控件指定特定的名称。 还可以通过在“属性”窗口中更改“Name”**属性的值来重命名控件。

提示

不能使用保留字命名宿主控件。 例如,如果将 NamedRange 控件添加到工作表,并将名称更改为“System”,生成项目时就会发生错误。

删除宿主控件

在文档级项目中,在 Excel 工作表或 Word 文档中选择控件并按 Delete 键,便可在设计时删除宿主控件。 但是,必须在 Excel 中使用**“定义名称”**对话框删除 NamedRange 控件。 有关更多信息,请参见How to: Delete NamedRange Controls at Design Time

如果在设计时向文档添加宿主控件,则不应在运行时以编程方式移除该控件,因为下次尝试在代码中使用此控件时会引发异常。 宿主控件的 Delete 方法只移除在运行时向文档中添加的宿主控件。 如果调用在设计时创建的宿主控件的 Delete 方法,就会引发异常。

例如,NamedRangeDelete 方法只能成功地删除以编程方式添加到工作表中(称为动态创建宿主控件)的 NamedRange。 也可以通过将控件名传递给 Worksheet.ControlsDocument.Controls 属性的 Remove 方法,来移除动态创建的宿主控件。 有关更多信息,请参见在运行时向 Office 文档添加控件

如果最终用户在运行时从文档中删除一个宿主控件,解决方案可能会以意想不到的方式失败。 可以在 Word 和 Excel 中使用文档保护功能,以使宿主控件不被删除。 有关更多信息,请参见 Office 开发示例和演练

提示

请不要在文档或工作表的 Shutdown 事件处理程序执行期间以编程方式移除控件。 当 Shutdown 事件发生时,UI 元素不再可用。 如果要在应用程序关闭之前移除控件,请将代码添加到另一个事件处理程序中,如 BeforeClose 或 BeforeSave。

针对宿主控件事件编程

宿主控件扩展 Office 对象的方法之一是添加事件。 例如,Excel 中的 Microsoft.Office.Interop.Excel.Range 对象和 Word 中的 Microsoft.Office.Interop.Word.Bookmark 对象没有事件,但是 Visual Studio Tools for Office Runtime通过添加可编程事件扩展了这些对象。 您可以访问这些事件并针对这些事件进行编码,其方式与访问 Windows 窗体上的控件事件的方式相同:即通过 Visual Basic 中的事件下拉列表和 C# 中的事件属性页。 有关更多信息,请参见演练:根据 NamedRange 控件的事件进行编程

提示

不应将 Excel 中 Application 对象的 EnableEvents 属性设置为 false。 将此属性设置为 false 将阻止 Excel 引发任何事件,包括宿主控件的事件。

请参见

概念

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

使用扩展对象实现 Word 自动化

使用扩展对象实现 Excel 自动化

其他资源

应用程序级外接程序编程

对文档级自定义项进行编程

Office 文档上的控件

将数据绑定到 Office 解决方案中的控件