在窗体之间传递数据

注释

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

本教程提供有关将数据从一个窗体传递到另一个窗体的分步说明。 通过使用 Northwind 示例数据库中的“客户”和“订单”表,一个窗体允许用户选择一个客户,另一个窗体显示所选客户的订单。 本教程介绍如何在第二个窗体上创建一个从第一个窗体接收数据的方法。

在本教程中,你将完成以下任务:

  • 创建新的 Windows 窗体应用(.NET Framework) 项目。
  • 使用 数据源配置向导创建和配置数据集。
  • 数据源窗口拖动项时,请选择要在窗体上创建的控件。 有关详细信息,请参阅设置从 数据源窗口拖动时要创建的控件
  • 通过将项从数据源窗口拖动到窗体上来创建数据绑定控件。
  • 创建包含显示数据的网格的第二个窗体。
  • 创建查询 TableAdapter 以提取特定客户的订单。
  • 在窗体之间传递数据。

注释

本教程仅演示在表单之间传递数据的一种方法。 还有其他选项可用于将数据传递到窗体,例如创建第二个构造函数来接收数据,或者创建可使用第一个表单中的数据设置的公共属性。

先决条件

  • 在 Visual Studio 中安装的 .NET 桌面开发和数据存储和处理工作负载。 若要安装它们,请打开 Visual Studio 安装程序 ,然后选择要使用的 Visual Studio 版本旁边的 “修改”或“ 更多>修改”。 有关详细信息,请参阅 修改 Visual Studio

  • SQL Server 下载页安装 SQL Server Express 2019 LocalDB,或通过 Visual Studio 安装程序 作为 数据存储和处理 工作负荷的一部分安装。

  • 通过以下步骤创建的 Northwind 示例数据库:

    1. 在 Visual Studio 中,通过从“视图”菜单中选择 SQL Server 对象资源管理器窗口,打开它。 SQL Server 对象资源管理器作为 数据存储和处理 工作负荷的一部分安装。

    2. 展开 SQL Server 节点,右键单击 LocalDB 实例,然后选择“ 新建查询 ”以打开查询编辑器窗口。

    3. Northwind Transact-SQL 脚本 复制到剪贴板。 此 T-SQL 脚本创建 Northwind 数据库,并使用数据填充该数据库。

    4. 将 T-SQL 脚本粘贴到查询编辑器中,然后选择窗口顶部 的“执行 ”以创建 Northwind 数据库。

创建 Windows 窗体应用项目

  1. 在 Visual Studio 的“文件”菜单中,依次选择“新建”“项目” 。

  2. “所有语言”下拉列表中选择 C#Visual Basic、“所有平台”下拉列表中的“Windows”和“所有项目类型”列表中的“桌面”。

  3. 从项目模板列表中选择 Windows 窗体应用(.NET Framework), 然后选择“ 下一步”。

  4. 将项目命名为 PassingDataBetweenForms,选择“ 下一步”,然后选择“ 创建”。

PassingDataBetweenForms 项目已创建并添加到解决方案资源管理器Form1 的设计器视图显示在编辑器中。

创建数据源

  1. 在 Visual Studio 菜单上选择“项目>添加新数据源”,打开“数据源”窗口。

  2. “数据源 ”窗口中,选择“ 添加新数据源 ”以启动 数据源配置 向导。

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

  4. “选择数据库模型 ”页上,验证是否指定 了数据集 ,然后选择“ 下一步”。

  5. “选择数据连接 ”页上,如果与 Northwind 示例数据库的数据连接已可用,请选择该数据库,然后继续执行 “选择数据库对象 ”步骤。 否则,请选择“新建连接”。

  6. 在“ 选择数据源 ”屏幕上,选择 Microsoft SQL Server 数据库文件,然后选择“ 继续”。

  7. 在“ 添加连接 ”屏幕上,选择“ 浏览”,浏览到 并选择northwnd.mdf 文件,然后选择“ 打开”。

  8. 选择 Windows 身份验证,或选择 SQL Server 身份验证 ,并提供用户名和密码来访问数据库。

  9. 选择 “测试连接 ”以测试连接。 连接成功后,选择“ 确定”。

  10. “选择数据连接 ”页上,确认数据库文件出现,然后选择“ 下一步”。

  11. 选择“ ”,弹出问题 是否要将文件复制到项目并修改连接?

  12. 在“ 将连接字符串保存到应用程序配置文件 ”页上,选择“ ”。 将连接 命名为 NorthwindConnectionString,然后选择“ 下一步”。

  13. 在“ 选择数据库对象 ”页上,展开 “表 ”节点,选择 “客户 ”和“ 订单 ”表,将数据集命名 为 NorthwindDataSet,然后选择“ 完成”。

NorthwindDataSet 将添加到项目中,“客户”和“订单”表将显示在“数据源”窗口中。

填写第一个表格

创建第二个窗体

创建第二个用来传递数据的表单。

  1. “项目”菜单中,选择“添加窗体”(Windows 窗体)。

  2. 保留 Form2 的默认名称,然后选择“ 添加”。

  3. 将主 “订单” 节点从 “数据源 ”窗口拖到 Form2 上。

    用于导航记录的 DataGridViewBindingNavigator 工具条显示在 Form2 上。 NorthwindDataSetCustomersTableAdapterBindingSourceBindingNavigator显示在组件托盘中。

  4. 从组件托盘中删除 OrdersBindingNavigatorBindingNavigatorForm2 中消失。

添加 TableAdapter 查询

向 Form2 添加查询 TableAdapter ,该查询加载 Form1 上所选客户的订单。

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

  2. 右键单击 Orders 表中的 OrdersTableAdapter,然后选择“添加>查询”。

  3. 保留 “使用 SQL 语句 ”的默认选项,然后选择“ 下一步”。

  4. 保留 SELECT 的默认选项 ,该选项返回行 ,然后选择“ 下一步”。

  5. 表加载什么数据方面,为了根据CustomerID返回Orders,需在查询末尾添加一个WHERE子句。 最终查询应类似于以下代码:

    SELECT OrderID, CustomerID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry
    FROM Orders
    WHERE CustomerID = @CustomerID
    

    注释

    对数据库使用正确的参数语法。 例如,在 Microsoft Access 中,WHERE 子句将如下所示 WHERE CustomerID = ?

  6. 选择 “下一步”。

  7. 选择生成方法的屏幕上,选择填充DataTable并输入FillByCustomerID

  8. 取消选择 “返回数据表 ”选项,然后选择“ 完成”。

在 Form2 上创建一个方法,用于将数据传递给 <另一个组件或对象>.

  1. 右键单击 Form2 并选择“ 查看代码 ”以在编辑器中打开 Form2 代码。

  2. Form2 代码中,删除方法的内容 Form2_Load ,并在方法后面 Form2_Load 添加以下代码:

internal void LoadOrders(String CustomerID)
{
    ordersTableAdapter.FillByCustomerID(northwindDataSet.Orders, CustomerID);
}

在 Form1 上创建一个方法来传递数据和显示 Form2

  1. Form1 的设计器视图中,右键单击“客户”数据网格,然后选择“ 属性”。

  2. “属性” 窗口中,选择顶部工具栏中的 “事件” 图标。

  3. 双击 DoubleClick 事件以打开代码编辑器。

  4. 在代码编辑器中,更新方法定义以匹配以下示例:

private void customersDataGridView_DoubleClick(object sender, EventArgs e)
{
    System.Data.DataRowView SelectedRowView;
    NorthwindDataSet.CustomersRow SelectedRow;

    SelectedRowView = (System.Data.DataRowView)customersBindingSource.Current;
    SelectedRow = (NorthwindDataSet.CustomersRow)SelectedRowView.Row;

    Form2 OrdersForm = new Form2();
    OrdersForm.LoadOrders(SelectedRow.CustomerID);
    OrdersForm.Show();
}

运行并测试应用

  1. F5 运行应用程序。

  2. 在应用程序中,双击 Form1 中的客户记录,以使用该客户的订单打开 Form2

后续步骤

根据应用程序要求,可以在表单之间传递数据后执行几个步骤。 对本教程进行一些改进,包括: