共用方式為


主機項目和主機控制項的程式設計限制

每個主機專案和主機控制項的行為都設計為類似於對應的原生 Microsoft Office Word 或 Microsoft Office Excel 物件,並具有其他功能。 不過,主機專案和主機控制項的行為與執行階段的原生 Office 物件之間有一些基本差異。

如需主機項目和主機控制項的一般資訊,請參閱 主機項目和主機控制項概觀

適用於: 本主題中的資訊適用於 Excel 和 Word 的文件層級專案和 VSTO 增益集專案。 如需詳細資訊,請參閱 Office 應用程式和專案類型所提供的功能

以程式設計方式建立主機項目

當您使用 Word 或 Excel 物件模型在執行階段以程式設計方式建立或開啟文件、活頁簿或工作表時,該專案不是主機專案。 相反地,新物件是原生 Office 物件。 例如,如果您使用該 Add 方法在運行時創建新的 Word 文檔,它將是本機 Document 對象而不是 Document 主項目。 同樣地,當您使用方法 Add 在執行時期建立新的工作表時,您會取得原生 Worksheet 物件,而不是 Worksheet 主機項目。

在文件層級專案中,您無法在執行時期建立宿主項目。 主項目(Host items)只能在文件層級專案的設計時期建立。 如需詳細資訊,請參閱 文件主機項目活頁簿主機項目工作表主機項目

在 VSTO 增益集專案中,您可以在執行階段建立 DocumentWorkbookWorksheet 裝載項目。 如需詳細資訊,請參閱 在執行時間於 VSTO 外掛程式中擴充 Word 文件和 Excel 活頁簿

以程式設計方式建立主機控制項

您可以在執行階段以程式設計方式將主機控制項新增至 DocumentWorksheet 主機專案。 如需詳細資訊,請參閱 在執行階段將控制項新增至 Office 文件

您無法將主機控制項新增至原生 DocumentWorksheet

備註

下列主機控制項無法以程式設計方式新增至工作表或文件: XmlMappedRangeXMLNodeXMLNodes

瞭解主機項目、主機控制以及原生 Office 物件之間的類型差異

對於每個主機項目和主機控制項,都有一個基礎原生 Microsoft Office Word 或 Microsoft Office Excel 物件。 您可以使用主機專案或主機控制項的 InnerObject 屬性來存取基礎物件。 不過,無法將原生 Office 物件轉換至其對應的主機專案或主機控制項。 如果您嘗試將原生 Office 物件轉換成主機專案或主機控制項的類型,則會拋出 InvalidCastException

在數種情況下,主機專案和主機控制項類型與基礎原生 Office 物件之間的差異可能會影響您的程式碼。

將主機系統控制權傳遞給方法和屬性

在 Word 中,您無法將主機控制項傳遞至需要原生 Word 物件做為參數的方法或屬性。 您必須使用主機控制項的 InnerObject 屬性來傳回基礎原生 Word 物件。 例如,您可以將InnerObject屬性從Bookmark主機控制項傳遞給方法,然後將Bookmark物件傳遞給方法。

在 Excel 中,當方法或屬性預期基礎 Excel 物件時,您必須使用主機控制項的 InnerObject 屬性,將主機控制項傳遞至方法或屬性。

下列範例會建立控制 NamedRange 項,並將它傳遞至 AutoFill 方法。 程式代碼使用具名範圍的InnerObject屬性來傳回Range方法所需的基礎 OfficeAutoFill

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 方法和屬性的傳回類型

主機專案的大部分方法和屬性都會傳回主機專案所依據的基礎原生 Office 物件。 例如, Parent Excel 中主機控制項的 NamedRange 屬性會傳回 Worksheet 物件,而不是 Worksheet 主機專案。 同樣地,Word 中宿主控制的 RichTextContentControl 屬性會傳回 Document 物件,而不是宿主項目 Document

存取主機控制項的集合

Visual Studio Tools for Office 執行階段不會為每種類型的主機控制項提供個別集合。 相反地,請使用主機項目的 Controls 屬性,逐一查看文件或工作表上的所有 Managed 控制項 (主機控制項和 Windows Forms 控制項),然後尋找符合您感興趣的主機控制項類型的項目。 下列程式碼範例會檢查 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 屬性的詳細資訊,請參閱 在執行階段將控制項新增至 Office 文件

Word 和 Excel 物件模型包含可在文件和工作表上公開原生控制項集合的屬性。 您無法使用這些屬性來存取受控控制項。 例如,無法使用 BookmarksBookmark 屬性或 DocumentBookmarks 屬性來列舉文件中的每個 Document 主機控制項。 這些屬性只包含 Bookmark 文件中的控制項,不包含 Bookmark 文件中的主機控制項。