演练:应用程序级项目中的复杂数据绑定

可以将数据绑定到应用程序级项目中的宿主控件和 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 外接程序项目。

创建新项目

  • 使用 Visual Basic 或 C# 创建一个名为“基于数据库填充工作表”的 Excel 外接程序项目。

    有关更多信息,请参见如何:在 Visual Studio 中创建 Office 项目

    Visual Studio 会打开 ThisAddIn.vb 或 ThisAddIn.cs 文件,并将“基于数据库填充工作表”项目添加到**“解决方案资源管理器”**中。

创建数据源

使用**“数据源”**窗口向您的项目中添加类型化数据集。

向项目中添加类型化数据集

  1. 如果 数据源 窗口不可见,则显示那么,在菜单栏上,选择 查看其他窗口数据源

  2. 选择 添加新数据源 开始 数据源配置向导

  3. 单击**“数据库”,然后单击“下一步”**。

  4. 如果已与 AdventureWorksLT 数据库建立连接,请选择此连接,然后单击**“下一步”**。

    否则,单击**“新建连接”,然后使用“添加连接”**对话框创建新连接。有关更多信息,请参见如何:连接到数据库中的数据

  5. 在**“将连接字符串保存到应用程序配置文件中”页中,单击“下一步”**。

  6. 在**“选择数据库对象”页中,展开“表”,然后选择“Address (SalesLT)”**。

  7. 单击“完成”。

    AdventureWorksLTDataSet.xsd 文件即会添加到**“解决方案资源管理器”**中。此文件定义以下各项:

    • 一个名为 AdventureWorksLTDataSet 的类型化数据集。此数据集表示 AdventureWorksLT 数据库中的**“Address (SalesLT)”**表的内容。

    • 一个名为 AddressTableAdapter 的 TableAdapter。此 TableAdapter 可用来在 AdventureWorksLTDataSet 中读取和写入数据。有关更多信息,请参见TableAdapter 概述

    在本演练后面的部分中,您将使用这两个对象。

创建控件并将控件绑定到数据

对于本演练,用户一打开工作簿,ListObject 控件就会显示选定表中的所有数据。列表对象使用 BindingSource 将该控件连接到数据库。

有关将控件绑定到数据的更多信息,请参见将数据绑定到 Office 解决方案中的控件

添加列表对象、数据集和表适配器

  1. 在 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;
    
  2. 在 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();
    
  3. 将以下代码添加到 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);
    
    
    
  4. 创建一个范围并添加 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");
    
  5. 使用 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,而后者又绑定到此数据集对象。

请参见

任务

如何:用数据库中的数据填充工作表

如何:用数据库中的数据填充文档

如何:用服务中的数据填充文档

如何:用对象中的数据填充文档

如何:在工作表中滚动查看数据库记录

如何:使用宿主控件中的数据更新数据源

演练:文档级项目中的简单数据绑定

演练:文档级项目中的复杂数据绑定

参考

BindingSource 组件概述

概念

在 Office 解决方案中使用本地数据库文件概述

数据源概述

在 Visual Studio 中将 Windows 窗体控件绑定到数据

在 Office 解决方案中使用本地数据库文件概述

连接到 Windows 窗体应用程序中的数据

其他资源

Office 解决方案中的数据

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