主項目和主控制項的程式設計限制
每個主項目和主控制項的行為,都已設計成像是對應的原生 Microsoft Office Word 或 Microsoft Office Excel 物件一樣,同時還具備額外的功能。 不過,主項目及主控制項與原生的 Office 物件之間在執行階段行為上還是有一些基本差異。
如需主項目和主控制項的一般資訊,請參閱主項目和主控制項概觀。
**適用於:**本主題中的資訊適用於下列應用程式的文件層級專案和應用程式層級專案:Excel 2007 和 Excel 2010、Word 2007 和 Word 2010。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
以程式設計方式建立主項目
當您使用 Word 或 Excel 物件模型以程式設計的方式在執行階段建立或開啟文件、活頁簿或工作表時,此項目並不是主項目。 相反地,這個新物件其實是原生的 Office 物件。 例如,如果您在執行階段使用 Documents.Add 方法建立新的 Word 文件,這個文件將會是原生 Microsoft.Office.Interop.Word.Document 物件,而非 Microsoft.Office.Tools.Word.Document 主項目。 同樣地,當您在執行階段使用 Worksheets.Add 方法建立新工作表時,您會得到原生 Microsoft.Office.Interop.Excel.Worksheet 物件,而非 Microsoft.Office.Tools.Excel.Worksheet 主項目。
在文件層級專案中,您無法在執行階段建立主項目。 主項目只能在設計階段建立於文件層級專案中。 如需詳細資訊,請參閱Document 主項目、Workbook 主項目和Worksheet 主項目。
在應用程式層級專案中,您可以在執行階段建立 Microsoft.Office.Tools.Word.Document、Microsoft.Office.Tools.Excel.Workbook 或 Microsoft.Office.Tools.Excel.Worksheet 主項目。 如需詳細資訊,請參閱在應用程式層級增益集的執行階段中擴充 Word 文件和 Excel 活頁簿。
以程式設計方式建立主控制項
您可以以程式設計的方式,在執行階段將主控制項加入至 Microsoft.Office.Tools.Word.Document 或 Microsoft.Office.Tools.Excel.Worksheet 主項目。 如需詳細資訊,請參閱在執行階段將控制項加入至 Office 文件。
您無法將主控制項加入至原生 Microsoft.Office.Interop.Word.Document 或 Microsoft.Office.Interop.Excel.Worksheet。
注意事項 |
---|
下列主控制項無法以程式設計的方式加入至工作表或文件:XmlMappedRange、XMLNode 和 XMLNodes。 |
了解主項目、主控制項和原生 Office 物件之間的型別差異
在每個主項目和主控制項中,都有基礎的原生 Microsoft Office Word 或 Microsoft Office Excel 物件。 您可以使用主項目或主控制項的 InnerObject 屬性來存取基礎物件。 不過,卻無法將原生 Office 物件轉型為其對應的主項目或主控制項。 如果嘗試將原生 Office 物件轉換為主項目或主控制項的型別,將會擲回 InvalidCastException。
在許多情況下,主項目和主控制項與基礎原生 Office 物件之間的型別差異會影響程式碼。
傳遞主控制項至方法和屬性
在 Word 中,您不能將主控制項傳遞至需要原生 Word 物件做為參數的方法或屬性 (Property)。 您必須使用主控制項的 InnerObject 屬性 (Property) 傳回基礎原生 Word 物件。 例如,您可以藉由將 Microsoft.Office.Tools.Word.Bookmark 主控制項的 InnerObject 屬性 (Property) 傳遞至方法,將 Microsoft.Office.Interop.Word.Bookmark 物件傳遞至方法。
在 Excel 中,有兩種情況必須使用主控制項的 InnerObject 屬性將主控制項傳遞至方法或屬性:
當方法或屬性 (Property) 需要基礎 Excel 物件時。
在目標為 .NET Framework 3.5 的專案中,Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 設定為 false,且方法或屬性預期 Object,而不是基礎 Excel 物件。 如需 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 的詳細資訊,請參閱使用各種地區設定,在 Excel 中格式化資料。
下列範例會建立 Microsoft.Office.Tools.Excel.NamedRange 控制項,並將其傳遞至 AutoFill 方法。 此程式碼會使用已命名範圍的 InnerObject 屬性,傳回 AutoFill 方法所需的基礎 Office Microsoft.Office.Interop.Excel.Range。
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);
傳回原生 Office 方法和屬性的型別。
主項目的大部分方法和屬性,都會傳回主項目所依據的基礎原生 Office 物件。 例如,Excel 中 NamedRange 主控制項的Parent 屬性會傳回 Microsoft.Office.Interop.Excel.Worksheet 物件,而不是傳回 Microsoft.Office.Tools.Excel.Worksheet 主項目。 同樣地,Word 中 RichTextContentControl 主控制項的 Parent 屬性會傳回 Microsoft.Office.Interop.Word.Document 物件,而不是傳回 Microsoft.Office.Tools.Word.Document 主項目。
存取主控制項的集合
Visual Studio Tools for Office Runtime 不會為每種型別的主控制項提供個別集合。 請改用主項目的 Controls 屬性在文件或工作表上逐一查看所有 Managed 控制項 (主控制項和 Windows Form 控制項),然後尋找與您想要使用的主控制項型別相符的項目。 下列程式碼範例會檢查 Word 文件中的每個控制項,並判斷控制項是否為 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 bookmark here.
}
}
如需主項目之 Controls 屬性的詳細資訊,請參閱在執行階段將控制項加入至 Office 文件。
Word 和 Excel 物件模型包括在文件和工作表上公開原生控制項集合的屬性。 您無法使用這些屬性存取 Managed 控制項。 例如,您無法使用 Microsoft.Office.Interop.Word.Document 的 Bookmarks 屬性或 Microsoft.Office.Tools.Word.Document 的 Bookmarks 屬性列舉文件中的每一個 Microsoft.Office.Tools.Word.Bookmark 主控制項。 這些屬性只包括文件中的 Microsoft.Office.Interop.Word.Bookmark 控制項,而不包括文件中的 Microsoft.Office.Tools.Word.Bookmark 主控制項。
在目標為 .NET Framework 3.5 的專案中存取新的 Excel 2010 和 Word 2010 成員
在目標為 .NET Framework 3.5 的 Excel 2010 和 Word 2010 專案中,主項目和主控制項不會提供 Office 2010 中引入的成員。 在這些專案中,主項目和主控制項只有 2007 Microsoft Office System 中提供的成員。 若要存取 Excel 2010 或 Word 2010 中加入的成員,請使用主控制項的 InnerObject 屬性傳回基礎原生物件,然後在該物件上存取成員。
例如,在 Word 2010 中,Microsoft.Office.Interop.Word.ContentControl 物件擁有 Checked 屬性,該屬性可以用來判斷是否已選取核取方塊內容控制項 (Word 2007 並未提供此屬性,因為 Word 2007 沒有核取方塊內容控制項)。 在目標為 .NET Framework 3.5 的 Word 2010 專案中,Microsoft.Office.Tools.Word.ContentControl 主控制項沒有 Checked 屬性。 下列程式碼範例示範如何使用 InnerObject 屬性存取基礎 Microsoft.Office.Interop.Word.ContentControl 物件的 Checked 屬性。
Me.Paragraphs(1).Range.InsertParagraphBefore()
Me.Paragraphs(1).Range.Select()
Dim checkBoxControl1 As Microsoft.Office.Tools.Word.ContentControl =
Me.Controls.AddContentControl("checkBoxControl1", Word.WdContentControlType.wdContentControlCheckBox)
' The following line of code compiles in projects that target the .NET Framework 4, but it does not compile
' in projects that target the .NET Framework 3.5.
checkBoxControl1.Checked = True
' In projects that target the .NET Framework 3.5, use the following code.
checkBoxControl1.InnerObject.Checked = True
this.Paragraphs[1].Range.InsertParagraphBefore();
this.Paragraphs[1].Range.Select();
Microsoft.Office.Tools.Word.ContentControl checkBoxControl1 =
this.Controls.AddContentControl("checkBoxControl1", Word.WdContentControlType.wdContentControlCheckBox);
// The following line of code compiles in projects that target the .NET Framework 4, but it does not compile
// in projects that target the .NET Framework 3.5.
checkBoxControl1.Checked = true;
// In projects that target the .NET Framework 3.5, use the following code.
checkBoxControl1.InnerObject.Checked = true;