将数据绑定到 Office 解决方案中的控件

可以将 Microsoft Office Word 文档或 Microsoft Office Excel 工作表中的 Windows 窗体控件和宿主控件绑定到某个数据源,以便这些控件自动显示数据。可以将数据绑定到应用程序级项目和文档级项目中的控件。

**适用于:**本主题中的信息适用于 Office 2013 和 Office 2010 的文档级项目和应用程序级项目。请参见按 Office 应用程序和项目类型提供的功能

宿主控件扩展 Word 和 Excel 对象模型中的对象,例如 Word 中的内容控件和 Excel 中的命名范围。有关更多信息,请参见宿主项和宿主控件概述

Windows 窗体和宿主控件使用 Windows 窗体数据绑定模型,该模型支持到数据源(例如数据集和数据表)的简单数据绑定和复杂数据绑定。有关 Windows 窗体中数据绑定模型的完整信息,请参见数据绑定和 Windows 窗体

链接到视频 有关相关的视频演示,请参见 How Do I: Consume Database Data in Excel?(如何实现:在 Excel 中使用数据库数据。)

简单数据绑定

当控件属性绑定到单个数据元素(如数据表中的值)时,便存在简单数据绑定。例如,NamedRange 控件中便有一个可绑定到数据集中一个字段的 Value2 属性。当数据集中的字段发生更改时,命名范围内的值也会发生更改。除 XMLNodes 控件外,所有宿主控件都支持简单数据绑定。XMLNodes 控件是一个集合,因此不支持数据绑定。

若要执行到宿主控件的简单数据绑定,请将 Binding 添加到此控件的 DataBindings 属性。Binding 对象表示控件属性值和数据元素值之间的简单绑定。

下面的示例演示如何在文档级项目中将 Value2 属性绑定到数据元素。

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 窗体控件支持复杂数据绑定,例如 DataGridView 控件。

若要执行复杂数据绑定,请将控件的 DataSource 属性设置为复杂数据绑定支持的数据源对象。例如,ListObject 控件的 DataSource 属性可以绑定到一个数据表中的多个列。数据表中的所有数据都出现在 ListObject 控件中,而当数据表中的数据发生更改时,ListObject 也会发生更改。有关可用于复杂数据绑定的数据源的列表,请参见 Windows 窗体支持的数据源

下面的代码示例创建一个具有两个 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"], "Customers");

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

有关演示复杂数据绑定的演练,请参见演练:文档级项目中的复杂数据绑定(对于文档级项目)或演练:应用程序级项目中的复杂数据绑定(对于应用程序级项目)。

在文档和工作簿中显示数据

在文档级项目中,可通过用于 Windows 窗体的相同方法,使用**“数据源”窗口轻松将数据绑定控件添加到文档或工作簿中。有关使用“数据源”**窗口的更多信息,请参见在 Visual Studio 中将 Windows 窗体控件绑定到数据“数据源”窗口

ad7sfx3w.collapse_all(zh-cn,VS.110).gif从“数据源”窗口中拖动控件

从**“数据源”**窗口中将一个对象拖动到文档中时,将在此文档中创建一个控件。所创建的控件的类型取决于绑定一列数据还是多列数据。

对于 Excel,会在工作表上为每个单独字段创建一个 NamedRange 控件,并为每个包含多个行和多个列的数据范围创建一个 ListObject 控件。通过在**“数据源”**窗口中选择表或字段,然后从下拉列表中选择不同的控件,即可更改此默认设置。

ContentControl 控件即会添加到文档中。内容控件的类型取决于所选字段的数据类型。

ad7sfx3w.collapse_all(zh-cn,VS.110).gif在文档级项目中在设计时绑定数据

以下主题给出在设计时绑定数据的示例:

ad7sfx3w.collapse_all(zh-cn,VS.110).gif在应用程序级项目中绑定数据

在应用程序级项目中,只能在运行时添加控件。以下主题给出在运行时绑定数据的示例:

更新绑定到宿主控件的数据

在数据源和宿主控件之间进行数据绑定会涉及到双向数据更新问题。在简单的数据绑定中,在数据源中所做的更改会自动在宿主控件中反映出来,但在宿主控件中所做的更改则需要通过显式调用才能更新数据源。此问题出现的原因在于:在某些情况下,如果只更改一个数据绑定字段而没有相应地更改其他数据绑定字段,则不会接受对该数据绑定字段所做的更改。例如,假定有两个字段,一个是年龄字段,另一个是工作经验字段。工作经验值不可能比年龄值大。用户不能将年龄字段从 50 更新为 25,然后再将工作经验字段从 30 更新为 10,而只能同时对这两个字段做相应的更改。若要解决这个问题,只有通过代码来显式发送更新,才能对简单数据绑定字段进行更新。

若要从支持简单数据绑定的宿主控件更新数据源,则必须将更新发送到内存中数据源(例如 DataSetDataTable)和后端数据库(如果您的解决方案使用一个这样的数据库)。

如果使用 ListObject 控件执行复杂数据绑定,则无需显式更新内存中数据源。在此情况下,无需其他代码,更改即自动发送到内存中数据源。

有关更多信息,请参见如何:使用宿主控件中的数据更新数据源

请参见

任务

如何:在 Windows 窗体上创建简单绑定控件

如何:使用 TableAdapter 更新数据

概念

数据绑定和 Windows 窗体

在 Visual Studio 中将 Windows 窗体控件绑定到数据

将数据保存在数据集中

缓存数据

其他资源

如何:我在 Excel 中使用数据库数据?

Office 解决方案中的数据