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

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

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

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

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

简单数据绑定

当控件属性绑定到单个数据元素(例如数据表中的值)时,就存在简单数据绑定。 例如,NamedRange 控件具有一种 Value2 属性,该属性可以绑定到数据集中的字段。 数据集中的字段更改时,命名区域中的值也会更改。 XMLNodes 控件除外,所有主机控件都支持简单数据绑定。 控件 XMLNodes 是一个集合,因此它不支持数据绑定。

若要对主机控件执行简单的数据绑定,请向控件的属性添加一个BindingDataBindings。 对象 Binding 表示控件的属性值与数据元素的值之间的简单绑定。

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

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

有关演示简单数据绑定的教程,请参阅 文档级项目中的简单数据绑定演练VSTO 加载项项目中的简单数据绑定演练

复杂数据绑定

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

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

下面的代码示例创建一个包含两DataSetDataTable对象的对象,并使用数据填充其中一个表。 然后,该代码将 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 控件执行复杂数据绑定时,无需显式更新内存中数据源。 在这种情况下,更改会自动发送到内存中数据源,而无需额外的代码。

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