将数据绑定到 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 窗体控件绑定到数据和“数据源”窗口。
从“数据源”窗口中拖动控件
从**“数据源”**窗口中将一个对象拖动到文档中时,将在此文档中创建一个控件。所创建的控件的类型取决于绑定一列数据还是多列数据。
对于 Excel,会在工作表上为每个单独字段创建一个 NamedRange 控件,并为每个包含多个行和多个列的数据范围创建一个 ListObject 控件。通过在**“数据源”**窗口中选择表或字段,然后从下拉列表中选择不同的控件,即可更改此默认设置。
ContentControl 控件即会添加到文档中。内容控件的类型取决于所选字段的数据类型。
在文档级项目中在设计时绑定数据
以下主题给出在设计时绑定数据的示例:
在应用程序级项目中绑定数据
在应用程序级项目中,只能在运行时添加控件。以下主题给出在运行时绑定数据的示例:
更新绑定到宿主控件的数据
在数据源和宿主控件之间进行数据绑定会涉及到双向数据更新问题。在简单的数据绑定中,在数据源中所做的更改会自动在宿主控件中反映出来,但在宿主控件中所做的更改则需要通过显式调用才能更新数据源。此问题出现的原因在于:在某些情况下,如果只更改一个数据绑定字段而没有相应地更改其他数据绑定字段,则不会接受对该数据绑定字段所做的更改。例如,假定有两个字段,一个是年龄字段,另一个是工作经验字段。工作经验值不可能比年龄值大。用户不能将年龄字段从 50 更新为 25,然后再将工作经验字段从 30 更新为 10,而只能同时对这两个字段做相应的更改。若要解决这个问题,只有通过代码来显式发送更新,才能对简单数据绑定字段进行更新。
若要从支持简单数据绑定的宿主控件更新数据源,则必须将更新发送到内存中数据源(例如 DataSet 或 DataTable)和后端数据库(如果您的解决方案使用一个这样的数据库)。
如果使用 ListObject 控件执行复杂数据绑定,则无需显式更新内存中数据源。在此情况下,无需其他代码,更改即自动发送到内存中数据源。
有关更多信息,请参见如何:使用宿主控件中的数据更新数据源。
请参见
任务
概念
在 Visual Studio 中将 Windows 窗体控件绑定到数据