主机项和主机控件概述

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

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

主机项

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

  • Document

  • Workbook

  • Worksheet

  • ChartSheet

    上述每种类型扩展了存在于本机 Word 或 Excel 对象模型的对象,称为 本机 Office 对象。 例如, Document 宿主项扩展了 Word 的主互操作程序集中定义的 Document 对象。

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

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

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

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

在文档级项目中,宿主项提供了代码的入口点,并且它们的设计器可帮助你开发解决方案。

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

Workbook 宿主项并不会充当具有用户界面的控件的容器。 相反,此宿主项的设计器充当组件栏,这使你可以将一个组件(如 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 宿主项上。 下图显示宿主项和宿主控件之间的关系。

    Relationship between host items and host controls

    您还可以通过将 Windows 窗体控件添加到 Word 和 Excel 文档图面,从而在 Office 解决方案中使用 Windows 窗体控件。 有关详细信息,请参阅有关办公室文档概述的Windows 窗体控件。

注意

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

向文档添加主机控件

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

名称主机控件

将宿主控件从“工具箱” 拖动到文档时,将自动使用末端尾号递增的控件类型对该控件命名。 例如,书签命名为 bookmark1bookmark2,依此类推。 如果使用 Word 或 Excel 的本机功能来添加控件,你可以在创建此控件时指定特定名称。 也可以通过在“属性” 窗口更改“名称” 属性的值来重命名你的控件。

注意

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

删除主机控件

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

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

例如,如果以编程方式添加到工作表,则 Delete 方法 NamedRange 仅成功删除 NamedRange ,这被称为动态创建宿主控件。 也可以通过将控件名称传递到 RemoveControls 属性的 Controls 方法来删除动态创建的宿主控件。 有关详细信息,请参阅在运行时向办公室文档添加控件。

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

注意

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

针对主机控制事件的程序

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

注意

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