共用方式為


在執行階段將控制項新增至 Office 文件

您可以在執行階段將控制項新增至 Microsoft Office Word 文件和 Microsoft Office Excel 活頁簿。 您也可以在執行階段移除它們。 您在執行階段新增或移除的控制項稱為 動態控制項

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

本主題說明下列內容:

使用控制項集合在執行階段管理控制項

若要在執行階段新增、取得或移除控制項,請使用 和 ControlCollection 物件的ControlCollection協助程式方法。

您存取這些物件的方式取決於您正在開發的專案類型:

新增控制項

ControlCollectionControlCollection類型包含協助程式方法,可用來將主機控制項和一般 Windows Forms 控制項新增至文件和工作表。 每個方法名稱都有格式 Add控制項類別,其中 控制項類別 是您要新增之控制項的類別名稱。 例如,若要將控制項新增至 NamedRange 文件,請使用 方法 AddNamedRange

以下程式碼範例會在 Excel 的文件層級專案中,將 NamedRange 新增到 Sheet1

Excel.Range range1 = Globals.Sheet1.Range["A1", "D5"];
Microsoft.Office.Tools.Excel.NamedRange namedRange1 =
    Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource");

存取和刪除控制項

您可以使用 ControlsWorksheetDocument 的屬性來逐一查看文件中的所有控制項,包括您在設計階段新增的控制項。 您在設計階段新增的控制項也稱為 靜態控制項

您可以呼叫 Delete 控制項的方法,或呼叫 Remove 每個 Controls 集合的方法,以移除動態控制項。 下列程式碼範例使用Remove方法,從 Excel 的文件層級專案中移除一個NamedRangeSheet1

Globals.Sheet1.Controls.Remove("ChartSource");

您無法在執行階段移除靜態控制項。 如果您嘗試使用DeleteRemove方法來移除靜態控制項,系統會拋出CannotRemoveControlException

備註

請勿以程式設計方式移除文件事件處理常式中的 Shutdown 控制項。 當 Shutdown 事件引發時,文件的 UI 元素將不再可用。 如果您想要在文件關閉之前移除控制項,請將程式碼新增至另一個事件的事件處理常式,例如 BeforeClose Word 的 或 BeforeSave ,或 BeforeCloseExcel 的 。BeforeSave

將主機控制項新增至文件

當您以程式設計方式將主機控制項新增至文件時,您必須提供唯一識別控制項的名稱,而且您必須指定在文件上新增控制項的位置。 如需特定指示,請參閱下列主題:

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

儲存文件然後關閉時,所有動態建立的主機控制項都會與其事件中斷連線,並失去其資料繫結功能。 您可以將程式碼新增至解決方案,以便在重新開啟文件時重新建立主機控制項。 如需詳細資訊,請參閱 在 Office 文件中保存動態控制項

備註

未針對下列主機控制項提供協助程式方法,因為這些控制項無法以程式設計方式新增至檔 XmlMappedRange:、 XMLNodeXMLNodes

將 Windows Forms 控制項新增至文件

當您以程式設計方式將 Windows Forms 控制項新增至文件時,您必須提供控制項的位置,以及唯一識別控制項的名稱。 Visual Studio Tools for Office 執行階段會為每個控制項提供協助程式方法。 這些方法會重載,因此您可以傳遞控制項位置的範圍或特定座標。

儲存文件然後關閉時,所有動態建立的 Windows Forms 控制項都會從文件中移除。 您可以將程式碼新增至解決方案,以在重新開啟文件時重新建立控制項。 如果您使用 VSTO 增益集建立動態 Windows Forms 控制項,控制項的 ActiveX 包裝函式會保留在文件中。 如需詳細資訊,請參閱 在 Office 文件中保存動態控制項

備註

Windows Forms 控制項無法以程式設計方式新增至受保護的文件。 如果您以程式設計方式取消保護 Word 文件或 Excel 工作表以新增控制項,則必須撰寫其他程式碼,以在關閉文件時移除控制項的 ActiveX 包裝函式。 控制項的 ActiveX 包裝函式不會自動從受保護的文件中刪除。

新增自訂控制項

如果您想要新增一個不受可用協助程式方法支援的項目,例如Control自訂使用者控制項,請使用下列方法:

  • 若為 Excel,請使用 AddControl 物件的其中一個 ControlCollection 方法。

  • 針對 Word,請使用ControlCollection物件的AddControl方法之一。

    為了新增控制項,請將控制項、控制項的位置,以及唯一識別控制項的名稱傳遞給AddControl方法。 此 AddControl 方法會傳回物件,以定義控制項如何與工作表或文件互動。 該 AddControl 方法返回一個 ControlSite (對於 Excel)或一個 ControlSite 對象(對於 Word)。

    下列程式碼範例示範如何使用方法 AddControl ,將自訂使用者控制項動態新增至文件層級 Excel 專案中的工作表。 在此範例中,使用者控制項名為 UserControl1,而 的名稱 Rangerange1。 若要使用此範例,請從專案中的Sheetn類別執行。

    UserControl1 customControl = new UserControl1();
    
    Microsoft.Office.Tools.Excel.ControlSite dynamicControl =
        this.Controls.AddControl(customControl, range1, "dynamic");
    

在自訂控制項中使用成員

使用其中 AddControl 一種方法將控制項新增至工作表或文件之後,您現在有兩個不同的控制項物件:

  • 代表自訂控制項的 Control

  • ControlSiteOLEObjectOLEControl 代表控制項在新增至工作表或文件後的物件。

    許多屬性和方法會在這些控制項之間共用。 請務必透過適當的控制項存取這些成員:

  • 若要存取只屬於自訂控制項的成員,請使用 Control

  • 若要存取控制項共用的成員,請使用 ControlSiteOLEObjectOLEControl 物件。

    如果您從 Control存取共用成員,則可能會失敗而沒有警告或通知,或產生無效的結果。 一律使用 ControlSiteOLEObjectOLEControl 物件的方法或屬性,除非所需的方法或屬性無法使用,這時才應參考 Control

    例如,ControlSite類別和Control類別都有Top屬性。 若要取得或設定控制項頂端與文件頂端之間的距離,請使用ControlSiteTop屬性,而不是ControlTop屬性。

    // Property is set in relation to the document.
    dynamicControl.Top = 100;
    
    // Property is set in relation to the container control.
    customControl.Top = 100;