将 WPF 控件绑定到 .NET Framework 应用程序中的数据集

注释

此类 DataSet 和相关类是 2000 年代初的旧版 .NET Framework 技术,使应用程序能够在应用与数据库断开连接时处理内存中的数据。 这些技术对于使用户能够修改数据并将更改保留回数据库的应用特别有用。 尽管数据集是经过证实的成功技术,但新 .NET 应用程序的建议方法是使用 Entity Framework Core。 Entity Framework 提供了一种更自然的方式来将表格数据用作对象模型,并且具有更简单的编程接口。

在本演练中,你将创建一个包含数据绑定控件的 WPF 应用程序。 这些控件绑定到封装在数据集中的产品记录。 还可以添加按钮来浏览产品,并保存对产品记录的更改。

本演练演示了以下任务:

  • 创建 WPF 应用程序,并从 AdventureWorksLT 示例数据库中的数据创建数据集。

  • 通过将数据表从 “数据源 ”窗口拖动到 WPF 设计器中的窗口来创建一组数据绑定控件。

  • 创建在产品记录中向前和向后导航的按钮。

  • 创建一个按钮,用于保存用户对数据表和基础数据源的产品记录所做的更改。

注释

本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE

先决条件

需要以下组件才能完成本演练:

  • 若要完成本教程,需要 .NET 桌面开发和数据存储以及处理 Visual Studio 中安装的工作负载。 若要安装它们,请打开 Visual Studio 安装程序,然后选择要修改的 Visual Studio 版本旁边的 修改(或 更多>修改)。 请参阅修改 Visual Studio

  • 访问附加了 AdventureWorks Light(AdventureWorksLT)示例数据库的 SQL Server 或 SQL Server Express 正在运行的实例。 若要下载数据库,请参阅 AdventureWorks 示例数据库

事先了解以下概念也很有用,但对于完成本演练并不是必需的:

创建项目

创建新的 WPF 项目以显示产品记录。

  1. 打开 Visual Studio。

  2. 在“开始”窗口上,选择创建新项目

  3. 搜索 C# WPF 应用 项目模板,并按照步骤创建项目,命名项目 AdventureWorksProductsEditor

    Visual Studio 创建 AdventureWorksProductsEditor 项目。

为应用程序创建数据集

在创建数据绑定控件之前,必须为应用程序定义数据模型并将其添加到 “数据源 ”窗口。 在本演练中,将创建一个数据集以用作数据模型。

  1. “数据 ”菜单上,单击“ 显示数据源”。

    此时会打开 “数据源 ”窗口。

  2. “数据源 ”窗口中,单击“ 添加新数据源”。

    此时会打开 “数据源配置 ”向导。

  3. 在“ 选择数据源类型 ”页上,选择“ 数据库”,然后选择“ 下一步”。

  4. 在“ 选择数据库模型 ”页上,选择 “数据集”,然后选择“ 下一步”。

  5. 在“ 选择数据连接 ”页上,选择以下选项之一:

    • 如果下拉列表中提供了与 AdventureWorksLT 示例数据库的数据连接,请选择它,然后选择“ 下一步”。

    • 单击 “新建连接”,并创建与 AdventureWorksLT 数据库的连接。

  6. 在“ 将连接字符串保存到应用程序配置文件 ”页上,选择“ 是”,将连接另存为 复选框,然后选择“ 下一步”。

  7. 在“ 选择数据库对象 ”页上,展开 “表”,然后选择“ 产品”(SalesLT) 表。

  8. 单击“完成”。

    Visual Studio 向项目添加新 AdventureWorksLTDataSet.xsd 文件,并将相应的 AdventureWorksLTDataSet 项添加到 “数据源 ”窗口。 该文件 AdventureWorksLTDataSet.xsd 定义了一个名为 AdventureWorksLTDataSet 的类型化数据集和一个名为 ProductTableAdapter 的 TableAdapter。 在本演练的后面部分,你将使用ProductTableAdapter来填充数据集,并将更改保存到数据库中。

  9. 构建项目。

编辑 TableAdapter 的默认填充方法

若要向数据集填充数据,请使用 FillProductTableAdapter 方法。 默认情况下,Fill 方法将向 ProductDataTable 中的 AdventureWorksLTDataSet 填充 Product 表包含的所有数据行。 可以修改此方法以仅返回行的子集。 对于本演练而言,将修改 Fill 方法以仅返回具有照片的产品行。

  1. 解决方案资源管理器中,双击 AdventureWorksLTDataSet.xsd 文件。

    数据集设计器随即打开。

  2. 在设计器中,右键单击 FillGetData() 查询并选择 Configure

    TableAdapter 配置向导随即打开。

  3. “输入 SQL 语句”页中,在文本框中的SELECT语句后面添加以下WHERE子句。

    WHERE ThumbnailPhotoFileName <> 'no_image_available_small.gif'
    
  4. 单击“完成”。

定义用户界面

通过修改 WPF 设计器中的 XAML,向窗口添加多个按钮。 在本演练的后面部分,你将添加代码,让用户可以使用这些按钮滚动浏览和保存对产品记录的更改。

  1. 解决方案资源管理器中,双击 MainWindow.xaml

    窗口将在 WPF 设计器中打开。

  2. 在设计器的 XAML 视图中,在标记之间 <Grid> 添加以下代码:

    <Grid.RowDefinitions>
        <RowDefinition Height="75" />
        <RowDefinition Height="625" />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75">&lt;</Button>
    <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">&gt;</Button>
    <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
    
  3. 构建项目。

创建数据绑定控件

通过将表从“数据源”窗口拖动Product到 WPF 设计器来创建显示客户记录的控件。

  1. “数据源 ”窗口中,单击 “产品 ”节点的下拉列表菜单,然后选择“ 详细信息”。

  2. 展开 “产品 ”节点。

  3. 对于此示例,不会显示某些字段,因此请单击以下节点旁边的下拉列表菜单,然后选择 “无” :

    • 产品类别ID

    • ProductModelID

    • 缩略图照片文件名

    • rowguid

    • 修改日期

  4. 单击 ThumbNailPhoto 节点旁边的下拉列表菜单,然后选择“ 图像”。

    注释

    默认情况下,表示图片 的“数据源 ”窗口中的项目将默认控件设置为 “无”。 这是因为图片以字节数组的形式存储在数据库中,字节数组可以包含从简单字节数组到大型应用程序的可执行文件中的任何内容。

  5. “数据源 ”窗口中,将 “产品 ”节点拖到包含按钮的行下的网格行。

    Visual Studio 生成 XAML,用于定义绑定到 Products 表中数据的一组控件。 它还生成加载数据的代码。 有关生成的 XAML 和代码的详细信息,请参阅将 WPF 控件绑定到 Visual Studio 中的数据

  6. 在设计器中,单击 产品 ID 标签旁边的文本框。

  7. “属性” 窗口中,选中 IsReadOnly 属性旁边的复选框。

添加代码,使用户能够使用 <> 按钮滚动浏览产品记录。

  1. 在设计器中,双击 < 窗口图面上的按钮。

    Visual Studio 将打开代码隐藏文件,并为该Click事件创建新的backButton_Click事件处理程序。

  2. Window_Loaded事件处理程序修改为使ProductViewSourceAdventureWorksLTDataSetAdventureWorksLTDataSetProductTableAdapter位于方法之外,并可供整个窗体访问。 仅向窗体全局声明这些项,并在 Window_Loaded 事件处理程序内为这些项赋值,如下所示:

    private AdventureWorksProductsEditor.AdventureWorksLTDataSet AdventureWorksLTDataSet;
    private AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter adventureWorksLTDataSetProductTableAdapter;
    private System.Windows.Data.CollectionViewSource productViewSource;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        AdventureWorksLTDataSet = ((AdventureWorksProductsEditor.AdventureWorksLTDataSet)(this.FindResource("adventureWorksLTDataSet")));
        // Load data into the table Product. You can modify this code as needed.
        adventureWorksLTDataSetProductTableAdapter = new AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
        adventureWorksLTDataSetProductTableAdapter.Fill(AdventureWorksLTDataSet.Product);
        productViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("productViewSource")));
        productViewSource.View.MoveCurrentToFirst();
    }
    
  3. 将以下代码添加到 backButton_Click 事件处理程序:

    if (productViewSource.View.CurrentPosition > 0)
    {
        productViewSource.View.MoveCurrentToPrevious();
    }
    
  4. 返回到设计器,然后双击该按钮 >

  5. 将以下代码添加到 nextButton_Click 事件处理程序:

    if (productViewSource.View.CurrentPosition < ((CollectionView)productViewSource.View).Count - 1)
    {
        productViewSource.View.MoveCurrentToNext();
    }
    

保存对产品记录的更改

添加代码,使用户能够使用“ 保存更改 ”按钮保存对产品记录的更改。

  1. 在设计器中,双击“ 保存更改 ”按钮。

    Visual Studio 将打开代码隐藏文件,并为该Click事件创建新的saveButton_Click事件处理程序。

  2. 将以下代码添加到 saveButton_Click 事件处理程序:

    adventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product);
    

    注释

    此示例使用TableAdapterSave方法来保存更改。 在本演练中,这样做是合适的,因为只更改一个数据表。 如果你需要保存对多个数据表所做的更改,则还可以使用 Visual Studio 利用你的数据集生成的 UpdateAllTableAdapterManager 方法。 有关详细信息,请参阅 TableAdapters

测试应用程序

生成并运行应用程序。 验证是否可以查看和更新产品记录。

  1. F5键。

    应用程序生成并运行。 检查下列各项:

    • 文本框显示包含照片的第一条产品记录中的数据。 此产品的产品 ID 为七百一十三,名称 Long-Sleeve 徽标球衣, S

    • 可以单击 >< 按钮浏览其他产品记录。

  2. 在产品记录之一中,更改 Size 值,然后选择“ 保存更改”。

  3. 关闭应用程序,然后在 Visual Studio 中按 F5 重启应用程序。

  4. 导航到已更改的产品记录,并验证更改是否持久保存。

  5. 关闭应用程序。

后续步骤

完成本演练后,可以尝试以下相关任务:

  • 了解如何使用 Visual Studio 中的 “数据源” 窗口将 WPF 控件绑定到其他类型的数据源。 有关详细信息,请参阅将 WPF 控件绑定到 WCF 数据服务

  • 了解如何使用 Visual Studio 中的 “数据源 ”窗口在 WPF 控件中显示相关数据(即父子关系中的数据)。 有关详细信息,请参阅 演练:在 WPF 应用中显示相关数据