Adding Controls to Office Documents at Run Time
Applies to |
---|
The information in this topic applies only to the specified Visual Studio Tools for Office projects and versions of Microsoft Office. Document-level projects
Application-level projects
For more information, see Features Available by Application and Project Type. |
You can add controls to a Microsoft Office Word document and Microsoft Office Excel workbook, and also remove them, at run time. Controls that you add to documents at run time are called dynamic controls. Starting in Visual Studio 2008 Service Pack 1 (SP1), you can add dynamic controls to documents and workbooks by using application-level add-ins.
This topic provides the following information:
Managing controls at run time by using the control collections
Adding host controls to documents
Adding Windows Forms controls to documents
For a related video demonstration, see How Do I: Add Controls to a Document Surface at Runtime?.
Managing Controls at Run Time by Using the Control Collections
To add, get, or remove controls at run time, use helper methods of the Microsoft.Office.Tools.Excel.ControlCollection and Microsoft.Office.Tools.Word.ControlCollection classes.
The way that you access the control collections depends on the type of project you are developing:
In a document-level project for Excel, use the Worksheet.Controls property of the Sheet1, Sheet2, and Sheet3 classes. For more information about these classes, see Worksheet Host Item.
In a document-level project for Word, use the Document.Controls property of the ThisDocument class. For more information about this class, see Document Host Item.
In an application-level project for Excel or Word, use the Controls property of a Microsoft.Office.Tools.Excel.Worksheet or Microsoft.Office.Tools.Word.Document that you generate at run time. For more information about generating these objects at run time, see Extending Word Documents and Excel Workbooks in Application-Level Add-ins at Run Time.
Adding Controls
The Microsoft.Office.Tools.Excel.ControlCollection and Microsoft.Office.Tools.Word.ControlCollection classes include helper methods you can use to add host controls and common Windows Forms controls to documents and worksheets. Each method name has the format Add<control class>, where control class is the class name of the control that you want to add. For example, to add a NamedRange control to your document, use the AddNamedRange method. For a complete list of helper methods, see Helper Methods for Host Controls and Helper Methods for Windows Forms Controls.
The following code example adds a NamedRange to Sheet1 in a document-level project for Excel.
Dim range1 As Excel.Range = Globals.Sheet1.Range("A1", "D5")
Dim namedRange1 As Microsoft.Office.Tools.Excel.NamedRange = _
Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource")
Excel.Range range1 = Globals.Sheet1.Range["A1", "D5"];
Microsoft.Office.Tools.Excel.NamedRange namedRange1 =
Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource");
Accessing and Deleting Controls
You can use the Controls property of a Microsoft.Office.Tools.Excel.Worksheet or Microsoft.Office.Tools.Word.Document to iterate through all the controls in your document, including the controls you added at design time. Controls that you add at design time are also called static controls.
You can remove dynamic controls by calling the Delete method of the control, or by calling the Remove method of each Controls collection. The following code example uses the Remove method to remove a NamedRange from Sheet1 in a document-level project for Excel.
Globals.Sheet1.Controls.Remove("ChartSource")
Globals.Sheet1.Controls.Remove("ChartSource");
You cannot remove static controls at run time. If you try to use the Delete or Remove method to remove a static control, a CannotRemoveControlException will be thrown.
Note
Do not programmatically remove controls in the Shutdown event handler of the document. The UI elements of the document are no longer available when the Shutdown event is raised. If you want to remove controls before the document closes, add your code to the event handler for another event, such as Document.BeforeClose or Document.BeforeSave for Word, or Workbook.BeforeClose, or Workbook.BeforeSave for Excel.
Adding Host Controls to Documents
When you programmatically add host controls to documents, you must provide a name that uniquely identifies the control, and you must specify where to add the control on the document. For specific instructions, see the following topics:
For more information about host controls, see Host Items and Host Controls Overview.
When a document is saved and then closed, all dynamically created host controls are disconnected from their events and they lose their data binding functionality. You can add code to your solution to re-create the host controls when the document is reopened. For more information, see Persisting Dynamic Controls in Office Documents.
Note
Helper methods are not provided for the following host controls, because these controls cannot be added programmatically to documents: XmlMappedRange, XMLNode, and XMLNodes.
Adding Windows Forms Controls to Documents
When you programmatically add a Windows Forms control to a document, you must provide the location of the control and a name that uniquely identifies the control. Visual Studio Tools for Office provides helper methods for each control. These methods are overloaded so that you can pass either a range or specific coordinates for the location of the control. For specific instructions, see How to: Add Windows Forms Controls to Office Documents.
When a document is saved and then closed, all dynamically created Windows Forms controls are removed from the document. You can add code to your solution to re-create the controls when the document is reopened. If you create dynamic Windows Forms controls by using an application-level add-in, the ActiveX wrappers for the controls are left in the document. For more information, see Persisting Dynamic Controls in Office Documents.
Note
Windows Forms controls cannot be programmatically added to protected documents. If you programmatically unprotect a Word document or Excel worksheet to add a control, you must write additional code to remove the control's ActiveX wrapper when the document is closed. The control's ActiveX wrapper is not automatically deleted from protected documents.
Adding Custom Controls
If you want to add a System.Windows.Forms.Control that is not supported by the available helper methods (for example, a custom user control), use the following methods:
For Excel, use one of the AddControl() methods of the Microsoft.Office.Tools.Excel.ControlCollection class.
For Word, use one of the AddControl() methods of the Microsoft.Office.Tools.Word.ControlCollection class.
To add the control, pass the System.Windows.Forms.Control, a location for the control, and a name that uniquely identifies the control to the AddControl method. For Excel, this method returns an OLEObject. For Word, this method returns an OLEControl. These objects define how the control interacts with the worksheet or document.
The following code example demonstrates how to use the AddControl(Control, Range, String) method to dynamically add a custom user control to a worksheet. In this example, the user control is named UserControl1, and the Range is named range1. This example assumes that it is being run from one of the Sheetn classes in a document-level project for Excel.
Dim customControl As New UserControl1()
Dim dynamicControl As Microsoft.Office.Tools.Excel.OLEObject = _
Me.Controls.AddControl(customControl, range1, "dynamic")
UserControl1 customControl = new UserControl1();
Microsoft.Office.Tools.Excel.OLEObject dynamicControl =
this.Controls.AddControl(customControl, range1, "dynamic");
Using Members of Custom Controls
After using one of the AddControl methods to add a control to a worksheet or document, you now have two different control objects:
The System.Windows.Forms.Control that represents the custom control.
The OLEObject or OLEControl that represents the control after it was added to the worksheet or document.
Many properties and methods are shared between these controls. It is important that you access these methods and properties through the appropriate control:
To access properties and methods that belong only to the custom control, use the System.Windows.Forms.Control.
To access properties and methods that are shared by the controls, use the OLEObject or OLEControl.
If you access a shared method or property from the System.Windows.Forms.Control, it might fail without warning or notification, or it can produce invalid results. Always use methods or properties of the OLEObject or OLEControl unless the method or property needed is not available; only then should you reference the System.Windows.Forms.Control.
For example, both the OLEObject class and the System.Windows.Forms.Control class have a Top property. To get or set the distance between the top of the control and the top of the document, use the Top property of the OLEObject, not the Top property of the System.Windows.Forms.Control.
' Property is set in relation to the document.
dynamicControl.Top = 100
' Property is set in relation to the container control.
customControl.Top = 100
// Property is set in relation to the document.
dynamicControl.Top = 100;
// Property is set in relation to the container control.
customControl.Top = 100;
See Also
Tasks
How to: Add ListObject Controls to Worksheets
How to: Add NamedRange Controls to Worksheets
How to: Add Chart Controls to Worksheets
How to: Add Content Controls to Word Documents
How to: Add Bookmark Controls to Word Documents
How to: Add Windows Forms Controls to Office Documents
Concepts
Persisting Dynamic Controls in Office Documents
Helper Methods for Host Controls
Helper Methods for Windows Forms Controls
Windows Forms Controls on Office Documents Overview
Other Resources
Change History
Date |
History |
Reason |
---|---|---|
July 2008 |
Added information about how to add controls to documents by using application-level add-ins. |
SP1 feature change. |