使用 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. JS中调用android和ios系统手机打开相机并可选择相册功能

    编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/57626154 实现android手机打开相机选择相册 ...

  2. 11.1,nginx集群概念

    集群介绍 为什么要用集群      

  3. Spring---bean的命名

    每个Bean可以有一个或多个 id,我们把第一个 id 称为“标识符”,其余id叫做“别名”,这些id在 IoC 容器中必须唯一. Bean  id 的命名约定: 遵循XML命名规范 由字母,数字,下 ...

  4. Spring mvc+hibernate+freemarker(实战)

    Spring mvc+hibernate+freemarker(实战) 博客分类: Spring Spring mvchibernatefreemarkerwebjava  今天我为大家做了一个 sp ...

  5. Android (shape,gradient)使用总结

    设置背景色可以通过在res/drawable里定义一个xml,如下: <?xml version="1.0" encoding="utf-8"?> ...

  6. selenium初识(二)——之webdriver API

    配置完的环境之后,我们先来写一个小脚本: # __Author__:"Jim_xie" from selenium import webdriver from time impor ...

  7. HA集群基本概念详解

    一.高可用集群的定义 二.高可用集群的衡量标准 三.高可用集群的层次结构 四.高可用集群的分类 五.高可用集群常用软件 六.共享存储 七.集群文件系统与集群LVM 八.高可用集群的工作原理 一.高可用 ...

  8. 原始套接字--icmp相关

    icmp请求 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <uni ...

  9. Codeforces Round #387 (Div. 2) 747E

    这题本身是个水题,但是写了半天 题意就是给出一个树的生成方式,让你还原这棵树,然后按深度输出结点 这个还原过程还是比较有趣的(没有用递归) PS:getline的新姿势get #include < ...

  10. GYM - 101620 J.Justified Jungle

    题意: 给出一棵树,删掉其中一些边,要求生成的每个子树节点数一样.输出所有可以删掉的边数. 题解: 以节点1为根,预处理每个子树的大小.对于每个n的因数x,还需满足子树为他倍数的点够n/x个,那么删的 ...