演练:应用程序级项目中的复杂数据绑定
可以将数据绑定到应用程序级项目中的宿主控件和 Windows 窗体控件。本演练演示如何在运行时向 Microsoft Office Excel 工作表中添加控件并将控件绑定到数据。
**适用于:**本主题中的信息适用于 Excel 2013 和 Excel 2010 的应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
本演练阐释了以下任务:
在运行时将 ListObject 控件添加到工作表中。
创建用于将该控件连接到某个数据集实例的 BindingSource。
说明 |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。 |
系统必备
您需要以下组件来完成本演练:
-
Visual Studio 2012 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.110\).md)。
Excel 2013 或 Excel 2010。
对附加了 AdventureWorksLT 示例数据库且正在运行的 SQL Server 2005 或 SQL Server 2005 Express 实例的访问权限。您可以从 CodePlex 网站下载 AdventureWorksLT 数据库。有关附加数据库的更多信息,请参见下列主题:
若要使用 SQL Server Management Studio 或 SQL Server Management Studio Express 来附加数据库,请参见如何:附加数据库 (SQL Server Management Studio)。
若要使用命令行来附加数据库,请参见如何:将数据库文件附加到 SQL Server Express。
创建新项目
第一步是创建一个 Excel 外接程序项目。
创建新项目
使用 Visual Basic 或 C# 创建一个名为“基于数据库填充工作表”的 Excel 外接程序项目。
有关更多信息,请参见如何:在 Visual Studio 中创建 Office 项目。
Visual Studio 会打开 ThisAddIn.vb 或 ThisAddIn.cs 文件,并将“基于数据库填充工作表”项目添加到**“解决方案资源管理器”**中。
创建数据源
使用**“数据源”**窗口向您的项目中添加类型化数据集。
向项目中添加类型化数据集
如果 数据源 窗口不可见,则显示那么,在菜单栏上,选择 查看,其他窗口,数据源。
选择 添加新数据源 开始 数据源配置向导。
单击**“数据库”,然后单击“下一步”**。
如果已与 AdventureWorksLT 数据库建立连接,请选择此连接,然后单击**“下一步”**。
否则,单击**“新建连接”,然后使用“添加连接”**对话框创建新连接。有关更多信息,请参见如何:连接到数据库中的数据。
在**“将连接字符串保存到应用程序配置文件中”页中,单击“下一步”**。
在**“选择数据库对象”页中,展开“表”,然后选择“Address (SalesLT)”**。
单击“完成”。
AdventureWorksLTDataSet.xsd 文件即会添加到**“解决方案资源管理器”**中。此文件定义以下各项:
一个名为 AdventureWorksLTDataSet 的类型化数据集。此数据集表示 AdventureWorksLT 数据库中的**“Address (SalesLT)”**表的内容。
一个名为 AddressTableAdapter 的 TableAdapter。此 TableAdapter 可用来在 AdventureWorksLTDataSet 中读取和写入数据。有关更多信息,请参见TableAdapter 概述。
在本演练后面的部分中,您将使用这两个对象。
创建控件并将控件绑定到数据
对于本演练,用户一打开工作簿,ListObject 控件就会显示选定表中的所有数据。列表对象使用 BindingSource 将该控件连接到数据库。
有关将控件绑定到数据的更多信息,请参见将数据绑定到 Office 解决方案中的控件。
添加列表对象、数据集和表适配器
在 ThisAddIn 类中声明下列控件,以显示 AdventureWorksLTDataSet 数据集的 Address 表。
Private addressListObject As Microsoft.Office.Tools.Excel.ListObject Private adventureWorksDataSet As AdventureWorksLTDataSet Private addressTableAdapter As AdventureWorksLTDataSetTableAdapters.AddressTableAdapter Private addressBindingSource As System.Windows.Forms.BindingSource
private Microsoft.Office.Tools.Excel.ListObject addressListObject; private AdventureWorksLTDataSet adventureWorksDataSet; private AdventureWorksLTDataSetTableAdapters.AddressTableAdapter addressTableAdapter; private System.Windows.Forms.BindingSource addressBindingSource;
在 ThisAddIn_Startup 方法中添加下面的代码,以使用 AdventureWorksLTDataSet 数据库中的信息初始化并填充数据集。
Me.addressTableAdapter = New AdventureWorksLTDataSetTableAdapters.AddressTableAdapter() Me.adventureWorksDataSet = New AdventureWorksLTDataSet() Me.addressTableAdapter.Fill(Me.adventureWorksDataSet.Address) Me.addressBindingSource = New System.Windows.Forms.BindingSource()
this.addressTableAdapter = new AdventureWorksLTDataSetTableAdapters.AddressTableAdapter(); this.adventureWorksDataSet = new AdventureWorksLTDataSet(); this.addressTableAdapter.Fill(this.adventureWorksDataSet.Address); this.addressBindingSource = new System.Windows.Forms.BindingSource();
将以下代码添加到 ThisAddIn_Startup 方法中。这会生成一个扩展工作表的宿主项。有关更多信息,请参见在运行时在应用程序级外接程序中扩展 Word 文档和 Excel 工作簿。
Dim worksheet As Excel.Worksheet = DirectCast(Me.Application.ActiveWorkbook.Worksheets(1), Excel.Worksheet) ' Create a workhseet host item. Dim extendedWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet)
Excel.Worksheet worksheet = (Excel.Worksheet)this.Application.ActiveWorkbook.Worksheets[1]; // Create a workhseet host item. Worksheet extendedWorksheet = Globals.Factory.GetVstoObject(worksheet);
创建一个范围并添加 ListObject 控件。
Dim cell As Excel.Range = extendedWorksheet.Range("$A$1:$G$5", System.Type.Missing) Me.addressListObject = extendedWorksheet.Controls.AddListObject(cell, "list1")
Excel.Range cell = extendedWorksheet.Range["$A$1:$G$5"]; this.addressListObject = extendedWorksheet.Controls.AddListObject(cell, "list1");
使用 BindingSource 将列表对象绑定到 AdventureWorksLTDataSet。传入希望绑定到列表对象的列的名称。
Me.addressBindingSource.DataSource = Me.adventureWorksDataSet.Address Me.addressListObject.AutoSetDataBoundColumnHeaders = True Me.addressListObject.SetDataBinding( _ Me.addressBindingSource, "", "AddressID", "AddressLine1", _ "AddressLine2", "City", "StateProvince", "CountryRegion", "PostalCode")
this.addressBindingSource.DataSource = this.adventureWorksDataSet.Address; this.addressListObject.AutoSetDataBoundColumnHeaders = true; this.addressListObject.SetDataBinding( this.addressBindingSource, "", "AddressID", "AddressLine1", "AddressLine2", "City", "StateProvince", "CountryRegion", "PostalCode");
测试外接程序
打开 Excel 时,ListObject 控件将显示 AdventureWorksLTDataSet 数据集的 Address 表中的数据。
测试外接程序
按 F5。
将在工作表中创建一个名为 addressListObject 的 ListObject 控件。同时,会将一个名为 adventureWorksLTDataSet 的数据集对象和一个名为 addressBindingSource 的 BindingSource 添加到项目中。此 ListObject 绑定到 BindingSource,而后者又绑定到此数据集对象。
请参见
任务
参考
概念
在 Visual Studio 中将 Windows 窗体控件绑定到数据