將資料繫結至控制項

更新: 2008 年 7 月

適用於

本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。

文件層級專案

  • Excel 2003

  • Excel 2007

  • Word 2003

  • Word 2007

應用程式層級專案

  • Excel 2007

  • Word 2007

如需詳細資訊,請參閱依應用程式和專案類型提供的功能

您可以將 Microsoft Office Word 文件或 Microsoft Office Excel 工作表中的 Windows Form 控制項和「主控制項」(Host Control) 繫結至資料來源,讓控制項自動顯示資料。

從 Visual Studio 2008 Service Pack 1 (SP1) 開始,您可以在應用程式層級專案中將資料繫結至控制項。如果沒有安裝 SP1,您就只能透過文件層級專案將資料繫結至控制項。

主控制項會擴充 Word 和 Excel 物件模型中的物件,例如 Word 中的內容控制項和 Excel 中的命名範圍。如需詳細資訊,請參閱主項目和主控制項概觀

Windows Form 和主控制項都會使用 Windows Form 資料繫結模型,這個模型同時支援對資料來源 (例如資料集和資料表) 的「簡單資料繫結」(Simple Data Binding) 和「複雜資料繫結」(Complex Data Binding)。如需 Windows Form 內資料繫結模型的詳細資訊,請參閱資料繫結和 Windows Form

簡單資料繫結

當控制項屬性繫結至單一資料項目,例如資料表中的值時,簡單資料繫結便會存在。例如,NamedRange 控制項具有 Value2 屬性,該屬性可繫結至資料集中的欄位。當資料集中的欄位變更時,命名範圍中的值也會變更。除了 XMLNodes 控制項以外,所有主控制項都支援簡單資料繫結。XMLNodes 控制項是一個集合,因此不支援資料繫結。

若要對主控制項進行簡單資料繫結,請將 Binding 加入至該控制項的 DataBindings 屬性。Binding 物件表示控制項屬性值與資料項目值之間的簡單繫結 (Simple Binding)。

下列程式碼範例示範如何透過文件層級專案,將 Value2 屬性繫結至資料項目。這個程式碼範例是 DataBindings 屬性完整範例的一部分。

Dim binding1 As New Binding("Value2", ds, "Customers.Names", True)
namedRange1.DataBindings.Add(binding1)
Binding binding1 = new Binding("Value2", ds, "Customers.Names", true);
namedRange1.DataBindings.Add(binding1);

如需示範簡單資料繫結的逐步解說,請參閱逐步解說:文件層級專案中的簡單資料繫結 (文件層級專案) 以及逐步解說:應用程式層級專案中的簡單資料繫結 (應用程式層級專案)。

複雜資料繫結

當控制項屬性繫結至一個以上的資料項目時,例如資料表中的多重資料行,複雜資料繫結便會存在。Excel 的 ListObject 控制項是唯一支援複雜資料繫結的主控制項。另外還有許多支援複雜資料繫結的 Windows Form 控制項,例如 DataGridView 控制項。

若要執行複雜資料繫結,請將控制項的 DataSource 屬性設定為複雜資料繫結所支援的資料來源物件。例如,ListObject 控制項的 DataSource 屬性可以繫結至資料表中的多個資料行。資料表中的所有資料會顯示在 ListObject 控制項中,而且當資料表中的資料變更時,ListObject 也會變更。如需可用於複雜資料繫結的資料來源清單,請參閱 Windows Form 支援的資料來源

下列程式碼範例會建立具有兩個 DataTable 物件的 DataSet,並將資料填入其中一個資料表。然後程式碼會將 ListObject 繫結至含有資料的資料表。這是示範 Excel 文件層級專案的範例。

Private Sub ListObject_DataSourceAndMember()
    ' Create a DataSet and two DataTables.
    Dim ordersDataSet As New DataSet("ordersDataSet")
    Dim tableCustomers As New DataTable("Customers")
    Dim tableProducts As New DataTable("Products")
    ordersDataSet.Tables.Add(tableCustomers)
    ordersDataSet.Tables.Add(tableProducts)

    ' Add a data to the Customers DataTable.
    tableCustomers.Columns.Add(New DataColumn("LastName"))
    tableCustomers.Columns.Add(New DataColumn("FirstName"))
    Dim dr As DataRow = tableCustomers.NewRow()
    dr("LastName") = "Chan"
    dr("FirstName") = "Gareth"
    tableCustomers.Rows.Add(dr)

    ' Create a list object.
    Dim List1 As Microsoft.Office.Tools.Excel.ListObject = _
        Me.Controls.AddListObject(Me.Range( _
        "A1"), "Customers")

    ' Bind the list object to the Customers table.
    List1.AutoSetDataBoundColumnHeaders = True
    List1.DataSource = ordersDataSet
    List1.DataMember = "Customers"

End Sub
private void ListObject_DataSourceAndMember()
{
    // Create a DataSet and two DataTables.
    DataSet ordersDataSet = new DataSet("ordersDataSet");
    DataTable tableCustomers = new DataTable("Customers");
    DataTable tableProducts = new DataTable("Products");
    ordersDataSet.Tables.Add(tableCustomers);
    ordersDataSet.Tables.Add(tableProducts);

    // Add a data to the Customers DataTable.
    tableCustomers.Columns.Add(new DataColumn("LastName"));
    tableCustomers.Columns.Add(new DataColumn("FirstName"));
    DataRow dr = tableCustomers.NewRow();
    dr["LastName"] = "Chan";
    dr["FirstName"] = "Gareth";
    tableCustomers.Rows.Add(dr);

    // Create a list object.
    Microsoft.Office.Tools.Excel.ListObject list1 = 
        this.Controls.AddListObject(
        this.Range["A1", missing], "Customers");

    // Bind the list object to the Customers table.
    list1.AutoSetDataBoundColumnHeaders = true;
    list1.DataSource = ordersDataSet;
    list1.DataMember = "Customers";
}

如需示範複雜資料繫結的逐步解說,請參閱逐步解說:文件層級專案中的複雜資料繫結 (文件層級專案) 以及逐步解說:應用程式層級專案中的複雜資料繫結 (應用程式層級專案)。

使用文件和活頁簿顯示資料

在文件層級專案中,您可以輕鬆地使用 [資料來源] 視窗將資料繫結的控制項加入至文件或活頁簿,方式與用於 Windows Form 相同。如需使用 [資料來源] 視窗的詳細資訊,請參閱顯示資料概觀資料來源視窗

從資料來源視窗拖曳控制項

從 [資料來源] 視窗將某個物件拖曳到文件時,文件上會建立控制項。所建立之控制項的型別,視您繫結的是單一資料行還是多個資料行的資料而有差異。

就 Excel 而言,工作表上會針對每個個別欄位建立 NamedRange 控制項,針對每一個包含多個資料列和資料行的資料範圍建立 ListObject 控制項。您可以變更此預設,方法是選取 [資料來源] 視窗中的資料表或欄位,然後從下拉式清單中選擇不同的控制項。

就 Word 2007 而言,文件中會加入ContentControl 控制項。內容控制項的型別則視您所選欄位的資料型別而定。如果是 Word 2003,文件中會加入 Bookmark 控制項。

使用文件層級專案在設計階段繫結資料

下列主題示範在設計階段繫結資料的範例:

使用應用程式層級專案繫結資料

在應用程式層級專案中,您只能在執行階段加入控制項。下列主題示範在執行階段繫結資料的範例:

更新繫結至主控制項的資料

資料來源和主控制項之間的資料繫結涉及雙向資料更新。在簡單資料繫結中,資料來源中的變更會自動反映在主控制項中,但主控制項中的變更需要明確的呼叫才能更新資料來源。原因是在某些狀況下,不會接受一個資料繫結欄位中的變更,除非它們伴隨另一個資料繫結欄位中的變更。例如,您可能有兩個欄位,一個用於年齡,另一個用於工作經驗。工作經驗不可超過年齡。使用者不可將年齡從 50 更新為 25,然後再將工作經驗從 30 更新為 10,除非該使用者同時對兩個欄位進行變更。若要解決這個問題,簡單資料繫結的欄位會在程式碼明確傳送更新之後才進行更新。

若要從可進行簡單資料繫結的主控制項更新資料來源,您必須將更新傳送至記憶體中資料來源 (例如 DataSetDataTable),並傳送至後端資料庫 (如果方案有使用的話)。

使用 ListObject 控制項執行複雜資料繫結時,不需要明確更新記憶體中資料來源。在這種情況下,變更會自動傳送至記憶體中資料來源,而不需其他程式碼。

如需詳細資訊,請參閱 HOW TO:從主控制項中使用資料更新資料來源

請參閱

工作

HOW TO:在 Windows Form 上建立簡單繫結控制項

HOW TO:使用 TableAdapter 更新資料

概念

資料繫結和 Windows Form

顯示資料概觀

儲存資料概觀

快取資料

其他資源

ADO.NET 中的並行控制項

Office 方案的資料

變更記錄

日期

記錄

原因

2008 年 7 月

加入有關在應用程式層級的增益集中繫結資料的資訊。

SP1 功能變更。