主机项和主机控件概述

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

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

主机项

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

  • Document

  • Workbook

  • Worksheet

  • ChartSheet

    每种类型都扩展了 Word 或 Excel 对象模型中本机存在的对象,这些对象被称为 本机 Office 对象。 例如,Document 宿主项扩展了 Document 对象,该对象是在 Word 的主互操作程序集里定义的。

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

  • 托管控件的功能,包括宿主控件和 Windows 窗体控件。

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

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

在文档级项目中,主机项目提供代码的入口点,并且它们配备有助于开发解决方案的设计器。

DocumentWorksheet宿主项具有关联的设计器,这些设计器是文档或工作表的可视化表示形式,如同 Windows 窗体设计器。 可以使用此设计器直接在 Word 或 Excel 中修改文档或工作表的内容,并将控件拖到设计图面上。 有关详细信息,请参阅 文档宿主项工作表宿主项

主机 Workbook 项不充当具有用户界面的控件的容器。 相反,此主机项的设计器充当组件托盘,使你可以将组件(如 a DataSet)拖到其设计图面上。 有关详细信息,请参阅 工作簿托管项

无法在文档级项目中以编程方式创建宿主项。 请改用 Visual Studio 在设计时在项目中自动生成的ThisDocumentThisWorkbookSheetn 个类。 这些生成的类派生自宿主项,并为您的代码提供了入口点。 有关详细信息,请参阅 主机项和主机控件的编程限制

了解 VSTO 外接程序项目中的宿主项

创建 VSTO 外接程序时,默认情况下无权访问任何主机项。 但是,您可以在运行时在 Word 和 Excel VSTO 外接程序中生成 DocumentWorkbookWorksheet 托管项。

生成宿主项后,可以执行诸如向文档添加控件等任务。 有关详细信息,请参阅 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿

主机控件

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

以下主机控件可用于 Excel 项目:

  • 图表控件

  • ListObject 控件

  • NamedRange 控件

  • XmlMappedRange 控件

    以下主机控件可用于 Word 项目:

  • 书签控件

  • 内容控件

  • XMLNode 控件

  • XMLNodes 控件

    添加到 Office 文档的主机控件的行为类似于本机 Office 对象;但是,主机控件具有其他功能,包括事件和数据绑定功能。 例如,如果要在 Excel 中捕获原生 Range 对象的事件,首先必须处理工作表的更改事件。 然后,必须确定更改是否发生在Range中。 相比之下, NamedRange 主机控件具有 Change 可以直接处理的事件。

    主机项和主机控件之间的关系类似于 Windows 窗体和 Windows 窗体控件之间的关系。 就像在 Windows 窗体上放置文本框控件一样,您将控件NamedRange 放置在宿主项Worksheet 上。 下图显示了主机项和主机控件之间的关系。

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

    可以通过将 Windows 窗体控件直接添加到 Word 和 Excel 文档表面,来在 Office 解决方案中使用这些控件。 有关详细信息,请参阅 Office 文档中的 Windows Forms 控件概述

注释

不支持将主机控件或 Windows 窗体控件添加到 Word 子文档。

向文档添加主机控件

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

主机名称控件

将主机控件从 工具箱 拖动到文档中时,控件会自动使用末尾带有增量数字的控件类型进行命名。 例如,书签命名为 bookmark1bookmark2 等。 如果使用 Word 或 Excel 的本机功能添加控件,则可以在创建控件时为其指定一个特定名称。 还可以通过在“属性”窗口中更改 Name 属性的值来重命名控件。

注释

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

删除主机控件

在文档级项目中,可以通过选择 Excel 工作表或 Word 文档上的控件并按 Delete 键,在设计时删除宿主控件。 但是,必须使用 Excel 中的“ 定义名称 ”对话框删除 NamedRange 控件。

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

例如,只有当NamedRange是通过编程方式添加到工作表中的,NamedRangeDelete方法才能成功删除它,这就是所谓的动态创建宿主控件。 还可以通过将控件名称传递给ControlsControls属性的Remove方法来删除动态创建的主机控件。 有关详细信息,请参阅 运行时向 Office 文档添加控件

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

注释

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

针对主机控制事件的程序

主机控件扩展 Office 对象的一种方法是添加事件。 例如, Range Excel 中的对象和 Bookmark Word 中的对象没有事件,但 Visual Studio Tools for Office 运行时通过添加可编程事件来扩展这些对象。 可以通过访问 Windows 窗体上的控件事件的方式访问和编码这些事件:通过 Visual Basic 中的事件下拉列表和 C# 中的事件属性页。 有关详细信息,请参阅 操作指南:针对 NamedRange 控件事件的编程

注释

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