使用 DataGridView 控件的一种最常见方案是“主/详细信息”窗体,这样的窗体可显示两个数据库表之间的父/子关系。如果选择主表中的行,将导致以相应的子数据来更新详细信息表。

主/详细信息窗体很容易实现,这需要使用 DataGridView 控件和 BindingSource 组件之间的交互。在本演练中,将使用两个 DataGridView 控件和两个 BindingSource 组件来生成窗体。窗体将显示 Northwind SQL Server 示例数据库中的两个相关表:CustomersOrders。完成后,将得到一个窗体,它可以在主 DataGridView 中显示数据库中的所有客户,并在详细信息 DataGridView 中显示所选客户的所有订单。

创建窗体

 

创建主/详细信息窗体

  1. 创建一个从 Form 派生的类,该类包含两个 DataGridView 控件和两个 BindingSource 组件。下面的代码提供了基本的窗体初始化,并包含一个 Main 方法。如果使用 Visual Studio 设计器来创建窗体,则可以使用设计器生成的代码而不是这里的代码,但一定要使用这里的变量声明中显示的名称。

  2. using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms;
    public class Form1 : System.Windows.Forms.Form {     private DataGridView masterDataGridView = new DataGridView();     private BindingSource masterBindingSource = new BindingSource();     private DataGridView detailsDataGridView = new DataGridView();     private BindingSource detailsBindingSource = new BindingSource();
        [STAThreadAttribute()]     public static void Main()     {         Application.Run(new Form1());     }
        // Initializes the form.     public Form1()     {         masterDataGridView.Dock = DockStyle.Fill;         detailsDataGridView.Dock = DockStyle.Fill;
            SplitContainer splitContainer1 = new SplitContainer();         splitContainer1.Dock = DockStyle.Fill;         splitContainer1.Orientation = Orientation.Horizontal;         splitContainer1.Panel1.Controls.Add(masterDataGridView);         splitContainer1.Panel2.Controls.Add(detailsDataGridView);
            this.Controls.Add(splitContainer1);         this.Load += new System.EventHandler(Form1_Load);         this.Text = "DataGridView master/detail demo";     } }

  3. 在窗体的类定义中实现一个方法,用于处理有关与数据库的连接的详细信息。此示例使用 GetData 方法来填充 DataSet 对象,并向数据集添加 DataRelation 对象,还要绑定 BindingSource 组件。务必将 connectionString 变量设置为适用于您的数据库的值,将敏感信息(如密码)存储在连接字符串中可能会影响应用程序的安全性。若要控制对数据库的访问,一种较为安全的方法是使用 Windows 身份验证(也称为集成安全性)。有关更多信息,请参见保护连接字符串

  4. private void GetData() {     try     {         // Specify a connection string. Replace the given value with a         // valid connection string for a Northwind SQL Server sample         // database accessible to your system.         String connectionString =             "Integrated Security=SSPI;Persist Security Info=False;" +             "Initial Catalog=Northwind;Data Source=localhost";         SqlConnection connection = new SqlConnection(connectionString);
            // Create a DataSet.         DataSet data = new DataSet();         data.Locale = System.Globalization.CultureInfo.InvariantCulture;
            // Add data from the Customers table to the DataSet.         SqlDataAdapter masterDataAdapter = new             SqlDataAdapter("select * from Customers", connection);         masterDataAdapter.Fill(data, "Customers");
            // Add data from the Orders table to the DataSet.         SqlDataAdapter detailsDataAdapter = new             SqlDataAdapter("select * from Orders", connection);         detailsDataAdapter.Fill(data, "Orders");
            // Establish a relationship between the two tables.         DataRelation relation = new DataRelation("CustomersOrders",             data.Tables["Customers"].Columns["CustomerID"],             data.Tables["Orders"].Columns["CustomerID"]);         data.Relations.Add(relation);
            // Bind the master data connector to the Customers table.         masterBindingSource.DataSource = data;         masterBindingSource.DataMember = "Customers";
            // Bind the details data connector to the master data connector,         // using the DataRelation name to filter the information in the         // details table based on the current row in the master table.         detailsBindingSource.DataSource = masterBindingSource;         detailsBindingSource.DataMember = "CustomersOrders";     }     catch (SqlException)     {         MessageBox.Show("To run this example, replace the value of the " +             "connectionString variable with a connection string that is " +             "valid for your system.");     } }

  5. 为窗体的 Load 事件实现一个处理程序,该事件将 DataGridView 控件绑定到 BindingSource 组件,并调用 GetData 方法。下面的示例所包括的代码可以调整 DataGridView 列的大小,以容纳所显示的数据。

  6. private void Form1_Load(object sender, System.EventArgs e) {     // Bind the DataGridView controls to the BindingSource     // components and load the data from the database.     masterDataGridView.DataSource = masterBindingSource;     detailsDataGridView.DataSource = detailsBindingSource;     GetData();
        // Resize the master DataGridView columns to fit the newly loaded data.     masterDataGridView.AutoResizeColumns();
        // Configure the details DataGridView so that its columns automatically     // adjust their widths when the data changes.     detailsDataGridView.AutoSizeColumnsMode =         DataGridViewAutoSizeColumnsMode.AllCells; }

使用两个 Windows 窗体 DataGridView 控件创建一个主/从窗体的更多相关文章

  1. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  2. 最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码

    Windows窗体DataGridView控件的性能调优.net 4.5   在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避 ...

  3. 性能调优的Windows窗体DataGridView控件

    性能调优的Windows窗体DataGridView控件 . 净框架4.5     在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你 ...

  4. 使用 Windows 窗体 TextBox 控件创建密码文本框

    密码框是一种 Windows 窗体文本框,它在用户键入字符串时显示占位符. 创建密码文本框 将 TextBox 控件的 PasswordChar 属性设置为某个特定字符. PasswordChar 属 ...

  5. Qt入门(5)——用Qt控件创建一个电话本界面

    具体实现步骤: 一.首先用 Qt Designer 创建一个两张图的对话框,分别保存为listdialog.ui和editdialog.ui文件 要注意其中各个空间对应的名称修改好 二.新建一个Qt应 ...

  6. 窗体DataGridView控件中按回车键时,单元格向下移动,如何能改成向右移动

    方法一:protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e) { base.OnKeyUp(e); if (e.Ke ...

  7. DataGridView控件

    DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特 ...

  8. DataGridView控件-[引用]

    DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特 ...

  9. DataGridView控件使用大全说明-各种常用操作与高级操作

    DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特 ...

随机推荐

  1. laravel5.5缓存系统

    目录 1 Redis的配置 1.1 安装PRedis 1.2 配置 1.2.1 配置redis数据库 1.2.2 更改session的配置 1.2.3 更改cache配置 1.3 使用redis 2 ...

  2. 创建、导入、导出、复制以及粘贴 WMI 筛选器

    TechNet 库 Deployment Forefront Identity and Access Management 基础结构优化 浏览器 Microsoft Dynamics Products ...

  3. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目5

    2014-03-20 03:23 题目:给定一个字符串,输出其全排列. 解法:可以调用STL提供的next_permutation(),也可以自己写一个.对于这种看起来简单的题目,应该在能优化的地方, ...

  4. Python 模块:random 随机数生成

    Python中的random模块用于生成随机数. 使用该模块之前需要 import random 几个常用的函数用法: 1.random.random 函数原型: random.random() 用于 ...

  5. Python 实现随机打乱字符串

    from random import shuffle def shuffle_str(s): # 将字符串转换成列表 str_list = list(s) # 调用random模块的shuffle函数 ...

  6. Kotlin中的“忍者”函数 —— 理解泛型的能力(KAD 12)

    作者:Antonio Leiva 时间:Feb 8, 2017 原文链接:https://antonioleiva.com/generic-functions-kotlin/ Kotlin的一些特性组 ...

  7. 更改maven本地仓库地址

    1.进入maven安装conf文件中,编辑settings.xml文件,新增图中的圈出的内容(我想要存放的地址是D:\HMY\m2\repository) 2.复制settings.xml文件至D:\ ...

  8. Djano之写api使用django_rest_framework【海瑞博客】

    使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白.那是你没有搞明白你自己的职责,做为后端,我们只要提 ...

  9. ASP.NET Core 认证与授权[2]:Cookie认证 (笔记)

    原文链接:https://www.cnblogs.com/RainingNight/p/cookie-authentication-in-asp-net-core.html 由于HTTP协议是无状态的 ...

  10. hnust 好友互动标识

    问题 A: 好友互动标识 时间限制: 1 Sec  内存限制: 128 MB提交: 897  解决: 122[提交][状态][讨论版] 题目描述       QQ有一个有趣的功能即显示好友互动标识,它 ...