使用 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. MyBatis---集合查询(一对多)

    这里的集合查询即一对多的数据联合查询.如一个用户多次登录的信息查询 要实现这样的联合查询需要在用户实体类中添加登录实体类的一个集合属性字段,表中不存在该字段. <resultMap id=&qu ...

  2. Android stadio Switch repository Android stadio切换仓库

    Android stadio 有时候,有很多module. 这些module 都有自己的仓库.也就是不在一块.那么,Android stadio 默认管理的就是根git. 如图,画对号的就是默认的. ...

  3. 9path 导致的一场冤假错案

    今天做对话框开发,遇到一个问题,就是弹出来的对话框太丑了.如图: 大家都是warp_content, 前面几个就是真的wrap_coment了.只有最后一个还可以看.后来自己找代码,写的都一样,就去问 ...

  4. python的高阶函数与匿名函数

    一.高阶函数的定义 高阶函数:就是把函数当成参数传递的一种函数,例如: def add(x,y,f): return f(x)+f(y) print(add(-8,11,abs) 结果:19 解释: ...

  5. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  6. DbVisualizer 解决中文乱码问题

    在SQL Commander中,sql语句中如果有中文,显示是‘口口口’. 解决办法如下: 在Tools->tool Properties->General->Appearance- ...

  7. python 之发送邮件服务[原著] 海瑞博客

    Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...

  8. python 学习分享-socketserver

    SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器 ...

  9. python multiprocessing.Pool 中map、map_async、apply、apply_async的区别

    multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...

  10. heat模板

    Heat 目前支持两种格式的模板,一种是基于 JSON 格式的 CFN 模板:另外一种是基于 YAML 格式的 HOT 模板.CFN 模板主要是为了保持对 AWS 的兼容性.HOT 模板是 Heat ...