转自http://msdn.microsoft.com/zh-cn/library/9z4e3456(VS.80).aspx
宿主项和宿主控件概述
宿主项和宿主控件是为 Visual Studio Tools for Office 解决方案提供编程模型的类。即,它们使得与基于 COM 的 Microsoft Office 应用程序进行交互更像与托管对象进行交互。
宿主项
宿主项为 Visual Studio Tools for Office 解决方案中的代码提供入口点。
应用程序级外接程序使用 Microsoft.Office.Tools.AddIn 宿主项。此宿主项提供对宿主应用程序和成员的对象模型的访问,这些宿主应用程序和成员可用来自定义宿主应用程序的用户界面。有关更多信息,请参见 AddIn。
文档级自定义项使用另一组宿主项,这些宿主项中包括 Microsoft.Office.Tools.Word.Document 和 Microsoft.Office.Tools.Excel.Worksheet。这些宿主项拥有设计器,它们是类的可视化表示,与 Windows 窗体设计器非常相似。这些宿主项可绑定到数据,而且是宿主控件和 Windows 窗体控件等控件的容器。有关更多信息,请参见 文档 和 Worksheet。
还有一个 Microsoft.Office.Tools.Excel.Workbook 宿主项,但它不作为宿主控件的容器。工作簿的作用相当于一个组件栏,使您能够将诸如 DataSet 之类的组件拖动到它的设计图面上。有关更多信息,请参见 Workbook。
宿主控件
宿主控件扩展了 Microsoft Office Word 2003 和 Microsoft Office Excel 2003 对象模型中的对象;换言之,宿主控件基于本机 Office 对象。宿主控件仅在文档级自定义项中可用。
添加到 Office 文档中的宿主控件的行为与本机 Office 对象(例如,范围)的行为类似;但是宿主控件还拥有其他功能,包括事件和数据绑定功能。例如,要捕获 Excel 中本机 Microsoft.Office.Interop.Excel.Range 对象的事件,必须首先捕获工作表的更改事件。然后必须确定 Microsoft.Office.Interop.Excel.Range 中是否发生了更改。使用 Microsoft.Office.Tools.Excel.NamedRange 控件,可以直接访问更改事件。
自定义项中宿主项和宿主控件之间的关系与 Windows 窗体和 Windows 窗体控件之间的关系非常相似。就像在 Windows 窗体上放置文本框控件一样,您可以在 Microsoft.Office.Tools.Excel.Worksheet 宿主项上放置 Microsoft.Office.Tools.Excel.NamedRange 控件。
此外,Visual Studio Tools for Office 还允许将 Windows 窗体控件直接添加到 Word 和 Excel 文档图面中,从而使您可以在文档级项目中使用 Windows 窗体控件。有关更多信息,请参见 Office 文档上的 Windows 窗体控件概述。
![]() |
---|
不支持向 Word 子文档添加宿主控件或 Windows 窗体控件。 |
将宿主项和宿主控件与本机 Office 对象进行比较
文档级项目中的宿主项和宿主控件与底层的本机 Office 对象相比,在几个方面都存在不同。此外,在针对宿主项或宿主控件进行编程时还存在一些限制。有关更多信息,请参见 宿主项和宿主控件的编程限制。
宿主项和宿主控件与本机 Office 对象的不同体现在以下几个方面:
-
通常,宿主控件具有的基本功能与作为其基础的 Office 对象的基本功能相同,但它们在以下方面进行了改进:
-
提供了更加丰富的事件模型。
-
具备数据绑定功能。
在某些情况下,由于控件是由不同类型的对象组合创建的,基本功能也会存在一些不同。有关示例,请参见 Bookmark 控件。
-
-
宿主控件是构建在本机 Office 对象之上的 Microsoft .NET 友好的类。
-
宿主控件为 Microsoft.Office.Tools.Excel 或 Microsoft.Office.Tools.Word 类型,而本机对象则为 Microsoft.Office.Interop.Excel 或 Microsoft.Office.Interop.Word 类型。
-
宿主项不能以编程方式创建;但是,大多数宿主控件都能以编程方式添加到 Word 或 Excel 文档中,或从中删除。有关更多信息,请参见 宿主项和宿主控件的编程限制。
将宿主控件添加到文档中
可以通过以下四种方法向 Word 2003 文档或 Excel 2003 工作表中添加宿主控件:
-
由于宿主控件是扩展的 Office 对象,因此可以在设计时从 Visual Studio 中将它们添加到文档中,其添加方式与添加本机对象的方式相同。例如,在“插入”菜单上单击“书签”,向文档中添加 Microsoft.Office.Tools.Word.Bookmark 控件。
-
可以将宿主控件从工具箱拖动到文档和工作表上。Visual Studio Tools for Office 将最常用的宿主控件添加到 Visual Studio 工具箱中。Excel 宿主控件可从 Excel 项目的“Excel 控件”选项卡中得到,而 Word 宿主控件可在 Word 项目的“Word 控件”选项卡中得到。有关更多信息,请参见 Word 宿主控件 和 Excel 宿主控件。
-
可以将宿主控件从“数据源”窗口拖动到文档和工作表上。这便使您能够添加已与文档中的数据绑定的控件。有关更多信息,请参见 将数据绑定到控件概述。
-
您可以通过编程方式创建 Bookmark、ListObject、NamedRange 和 Chart 控件。有关更多信息,请参见 如何:向 Word 文档添加书签控件、如何:向工作表添加 ListObject 控件、如何:向工作表添加 NamedRange 控件 和 如何:向工作表添加 Chart 控件。
为宿主控件命名
如果将某个宿主控件从“工具箱”拖动到文档中,该控件将自动以控件类型来命名,并在末尾追加递增的编号。例如,第一个书签的名称将为 Bookmark1,第二个书签的名称将为 Bookmark2。如果使用 Word 或 Excel 的本机功能添加控件,则可以在创建控件时为控件指定特定的名称。还可以使用“属性”窗口中的 Name 属性重命名控件。
![]() |
---|
不能使用保留字命名宿主控件。例如,如果将 NamedRange 控件添加到工作表,并将名称更改为“System”,生成项目时就会发生错误。 |
删除宿主控件
多数情况下,在 Excel 工作表或 Word 文档中选择控件并按 Delete 键,便可在设计时删除宿主控件。但是,必须在 Excel 中使用“定义名称”对话框删除 NamedRange 控件。有关更多信息,请参见 如何:在设计时删除 NamedRange 控件。
如果在设计时向文档添加宿主控件,则不应在运行时以编程方式移除该控件,因为下次尝试在代码中使用此控件时会引发异常。宿主控件的 Delete 方法只移除在运行时向文档中添加的宿主控件。如果调用在设计时创建的宿主控件的 Delete 方法,就会引发异常。例如,Bookmark1.Delete 只能成功删除以编程方式添加到文档中的 Bookmark1。将控件名传递给 ControlsCollection 的 Remove 方法,也可以移除动态创建的宿主控件。有关更多信息,请参见 在运行时向 Office 文档添加控件。
如果最终用户在运行时从文档中删除一个宿主控件(如书签),解决方案可能会以意想不到的方式失败。可以在 Word 和 Excel 中使用文档保护功能,以使宿主控件不被删除。有关更多信息,请参见 Word 文档保护技术示例 和 Excel 文档保护技术示例。
![]() |
---|
不要在文档的 Shutdown 事件处理程序执行期间以编程方式移除控件。Shutdown 事件发生时,文档的 UI 元素不再可用。如果要在应用程序关闭之前移除控件,请将代码添加到另一个事件处理程序中,如 BeforeClose 或 BeforeSave。 |
可用的宿主项和宿主控件
下面列出了可以在 Visual Studio Tools for Office 解决方案中使用的宿主项和宿主控件。
Excel 宿主项
Word 宿主项
外接程序宿主项
Excel 宿主控件
Word 宿主控件
针对宿主控件事件编程
宿主控件扩展 Office 对象的方法之一是添加事件。例如,Excel 中的 Microsoft.Office.Interop.Excel.Range 对象和 Word 中的 Microsoft.Office.Interop.Word.Bookmark 对象没有事件,但是 Visual Studio Tools for Office 通过添加可编程事件来扩展这些对象。您可以访问这些事件并针对这些事件进行编码,其方式与访问 Windows 窗体上的控件事件的方式相同:即通过 Visual Basic 中的事件下拉列表和 C# 中的事件属性页。有关更多信息,请参见 演练:根据 NamedRange 控件的事件进行编程。
![]() |
---|
不应将 Excel 中 Application 对象的 EnableEvents 属性设置为 false。将此属性设置为 false 将阻止 Excel 引发任何事件,包括宿主控件的事件。 |
将数据绑定到宿主控件
宿主控件还通过启用数据绑定来扩展 Office 对象。宿主控件与 Windows 窗体上的控件具有相同的数据绑定功能。您可以将宿主控件绑定到数据源,如数据集和数据表。宿主控件支持简单数据绑定或复杂数据绑定。有关更多信息,请参见 演练:将工作表单元格绑定到数据库字段 和 演练:将单元格绑定到表中的多个列。
简单数据绑定
当控件属性绑定到单个数据元素(如数据表中的值)时,便存在简单数据绑定。例如,NamedRange 控件中便有一个可绑定到数据集中一个字段的 Value2 属性。当数据集中的字段发生更改时,命名范围内的值也会发生更改。除 Microsoft.Office.Tools.Word.XMLNodes 外的所有宿主控件都支持简单数据绑定。XMLNodes 控件是一个集合,因此不支持数据绑定。
复杂数据绑定
当控件属性绑定到多个数据元素(如数据表中的多个列)时,便存在复杂数据绑定。例如,Microsoft.Office.Tools.Excel.ListObject 控件便有一个可绑定到数据表中多个列的 DataSource 属性。数据表中的所有数据都显示在 Microsoft.Office.Tools.Excel.ListObject 控件中,而当数据表中的数据发生更改时,Microsoft.Office.Tools.Excel.ListObject 也会发生更改。只有 Microsoft.Office.Tools.Excel.ListObject 控件支持复杂数据绑定。
请参见