将数据绑定到办公室解决方案中的控件

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

适用于: 本主题中的信息适用于文档级项目和 VSTO 外接程序项目。 请参阅办公室应用程序和项目类型提供的功能。

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

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

简单数据绑定

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

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

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

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

有关演示简单数据绑定的演练,请参阅 Walkthrough: Simple data binding in a document-level project for a document-level project and Walkthrough: Simple data binding in in VSTO Add-in project for a VSTO Add-in project .

复杂数据绑定

当控件属性绑定到多个数据元素(例如数据表中的多个列)时,即存在复杂数据绑定。 Excel 的 ListObject 控件是唯一支持复杂数据绑定的宿主控件。 此外,还有很多支持复杂数据绑定的 Windows 窗体控件,例如 DataGridView 控件。

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

下面的代码示例创建具有两个 DataSet 对象的 DataTable ,并使用数据填充其中一个表。 代码随后将 ListObject 绑定到包含数据的表。 此示例适用于 Excel 文档级项目。

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 窗体相同的方法,使用“数据源” 窗口轻松地将数据绑定控件添加到文档或工作簿中。 有关使用“数据源”窗口的详细信息,请参阅将Windows 窗体控件绑定到 Visual Studio 中的数据并添加新数据源

从“数据源”窗口拖动控件

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

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

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

在设计时绑定文档级项目中的数据

下面的主题介绍在设计时绑定数据的示例:

绑定 VSTO 外接程序项目中的数据

在 VSTO 外接程序项目中,仅可在运行时添加控件。 下面的主题介绍在运行时绑定数据的示例:

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

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

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

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

有关详细信息,请参阅 “如何:使用主机控件中的数据更新数据源”。