将数据绑定到 Office 解决方案中的控件
可以将 Microsoft Office Word 文档或 Microsoft Office Excel 工作表中的 Windows 窗体控件和宿主控件绑定到某个数据源,以便这些控件自动显示数据。 可以将数据绑定到应用程序级项目和文档级项目中的控件。
**适用于:**本主题中的信息适用于 Microsoft Office 2010 和 2007 Microsoft Office system 的文档级项目和应用程序级项目。有关更多信息,请参见按 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 属性绑定到数据元素。 此代码示例摘自一个为 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 窗体控件支持复杂数据绑定,例如 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", missing], "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 窗体控件绑定到数据