Programmatic Limitations of Host Items and Host Controls
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. |
Each host item and host control is designed to behave like a corresponding native Microsoft Office Word or Microsoft Office Excel object, with additional functionality. However, there are some fundamental differences between the behavior of host items and host controls and native Office objects at run time.
For general information about host items and host controls, see Host Items and Host Controls Overview.
Programmatically Creating Host Items
When you programmatically create or open a document, workbook, or worksheet at run time, the item is not a host item. Instead, the new object is a native Office object. For example, if you use the Add(Object, Object, Object, Object) method to create a new Word document at run time, it will be a native Document object rather than a Microsoft.Office.Tools.Word.Document host item. Similarly, when you create a new worksheet at run time using the Add(Object, Object, Object, Object) method, you get a native Worksheet object rather than a Microsoft.Office.Tools.Excel.Worksheet host item.
In document-level projects, you cannot create host items at run time. Host items can be created only at design time in document-level projects. For more information, see Document Host Item, Workbook Host Item, and Worksheet Host Item.
Starting in Visual Studio 2008 Service Pack 1 (SP1), you can create Microsoft.Office.Tools.Word.Document, Microsoft.Office.Tools.Excel.Workbook, or Microsoft.Office.Tools.Excel.Worksheet host items at run time in application-level add-ins for Excel 2007 and Word 2007. For more information, see Extending Word Documents and Excel Workbooks in Application-Level Add-ins at Run Time.
Programmatically Creating Host Controls
You can programmatically add host controls to a Microsoft.Office.Tools.Word.Document or Microsoft.Office.Tools.Excel.Worksheet host item at run time. For more information, see Adding Controls to Office Documents at Run Time.
You cannot add host controls to a native Document or Worksheet.
Note
The following host controls cannot be added programmatically to worksheets or documents: XmlMappedRange, XMLNode, and XMLNodes.
Understanding Type Differences Between Host Items, Host Controls, and Native Office Objects
For each host item and host control, there is an underlying native Microsoft Office Word or Microsoft Office Excel object. You can access the underlying object by using the InnerObject property of the host item or host control. However, there is no way to cast a native Office object to its corresponding host item or host control. If you try to cast a native Office object into the type of a host item or host control, an InvalidCastException is thrown.
There are several scenarios where the differences between the types of host items and host controls and the underlying native Office objects can affect your code.
Passing Host Controls to Methods and Properties
In Word, you cannot pass a host control to a method or property that requires a native Word object as a parameter. You must use the InnerObject property of the host control to return the underlying native Word object. For example, you can pass a Bookmark object to a method by passing the InnerObject property of the Microsoft.Office.Tools.Word.Bookmark host control to the method.
In Excel, there are two cases in which you must use the InnerObject property of the host control:
When the method or property expects the underlying Excel object.
When the ExcelLocale1033Attribute attribute is set to false and the method or property expects an Object instead of the underlying Excel object.
The following example creates a Microsoft.Office.Tools.Excel.NamedRange control and passes it to the AutoFill(Range, XlAutoFillType) method. The code uses the InnerObject property of the named range to return the underlying Office Range that is required by the AutoFill(Range, XlAutoFillType) method.
Me.Range("A1").Value2 = "Monday"
Me.Range("A2").Value2 = "Tuesday"
Dim dayRange As Microsoft.Office.Tools.Excel.NamedRange = _
Me.Controls.AddNamedRange(Me.Range("A1", "A7"), "dayRange")
Me.Range("A1", "A2").AutoFill(dayRange.InnerObject, Excel.XlAutoFillType.xlFillDays)
this.Range["A1", missing].Value2 = "Monday";
this.Range["A2", missing].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);
Return Types of Native Office Methods and Properties
Most methods and properties of host items return the underlying native Office object upon which the host item is based. For example, the Parent property of a NamedRange host control in Excel returns a Worksheet object rather than a Microsoft.Office.Tools.Excel.Worksheet host item. Similarly, the Parent property of a RichTextContentControl host control in Word returns a Document object rather than a Microsoft.Office.Tools.Word.Document host item.
Accessing Collections of Host Controls
Visual Studio Tools for Office does not provide individual collections for each type of host control. For example, it is not possible to enumerate each Microsoft.Office.Tools.Word.Bookmark control in the document using the Bookmarks collection. The Bookmarks collection includes all of the bookmarks in the document; it does not distinguish between a Microsoft.Office.Tools.Word.Bookmark control and a Bookmark.
You can use the Worksheet.Controls or Document.Controls properties to iterate through all controls (both host controls and Windows Forms controls) on the document or worksheet, and then look for items that match the type of the host control you are interested in. The following code example examines each control on a Word document and determines whether the control is a Microsoft.Office.Tools.Word.Bookmark.
Dim targetControl As Object
For Each targetControl In Me.Controls
If TypeOf (targetControl) Is Microsoft.Office.Tools.Word.Bookmark Then
Dim bookMark As Microsoft.Office.Tools.Word.Bookmark = _
CType(targetControl, Microsoft.Office.Tools.Word.Bookmark)
' Do some work with the book mark here.
End If
Next
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 book mark here.
}
}
See Also
Concepts
Host Items and Host Controls Overview
Reference
Other Resources
Change History
Date |
History |
Reason |
---|---|---|
July 2008 |
Added information about creating host items by using application-level add-ins. |
SP1 feature change. |