使用两个windows窗体datagridview控件创建一个主/从窗体

LongtengGensSupreme LongtengGensSupreme     2022-08-12     750

关键词:

使用 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; }

WPF DataGrid 与 Windows 窗体 DataGridView

】WPFDataGrid与Windows窗体DataGridView【英文标题】:WPFDataGridVsWindowsFormsDataGridView【发布时间】:2011-06-0413:05:17【问题描述】:我在WPF和Windows窗体方面有经验,但是只使用过Windows窗体DataGridView而不是WPFDataGrid(据我所知,它仅包含在.... 查看详情

使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView

】使用C#Windows窗体中SQL查询的大量结果填充dataGridView【英文标题】:PopulatedataGridViewwithalargesetofresultsfromSQLqueryinC#WindowsForms【发布时间】:2011-05-2704:15:41【问题描述】:我创建了一个WindowsForms,上面有一个dataGridView。我还有一个... 查看详情

数据网格视图更新,在 vb.net windows 窗体中编辑和删除,使用多个表来填充 datagridview

...新,在vb.netwindows窗体中编辑和删除,使用多个表来填充datagridview【英文标题】:datagridviewupdate,Editanddeleteinvb.netwindowsformthatusingmultipletabletopopulatedatagridview【发布时间】:2014-01-0607:20:13【问题描述】:我是Windows窗体应用程序的新... 查看详情

怎样在windows窗体程序中使用entityframework进行数据的增删?

我用C#开发Windows窗体应用程序,在一个窗体中使用了DataGridView控件显示数据,把DataGridView控件与EF的查询结果集绑定,数据正常显示(如下图),也能修改(直接在DataGridView中修改然后保存即可,保存按钮的Click事件调用的是DbCon... 查看详情

对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?

】对于使用“DataGridView”的Windows窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?【英文标题】:ForaWindowsFormsApplicationusing`DataGridView`,howcanIcheckavalueinmyDataSourceandchangethecolorofaseparatecell?【发布时间】:2016-09-1622:27:... 查看详情

Windows 窗体:从网站到 dataGridView 的 XML

】Windows窗体:从网站到dataGridView的XML【英文标题】:WindowsForms:XMLfromwebsitetodataGridView【发布时间】:2021-07-2716:51:28【问题描述】:我想将thisXML的特定部分直接导入到我在Windows窗体中的dataGridView中,无需下载XML文件。当前工作代... 查看详情

在 C# 中对 dataGridView 列进行排序? (Windows 窗体)

】在C#中对dataGridView列进行排序?(Windows窗体)【英文标题】:SortdataGridViewcolumnsinC#?(WindowsForm)【发布时间】:2010-10-2220:18:25【问题描述】:我有一个从sql表绑定的datagridview,在该dv中我有这些属性:Id、Name和Price。当我将名称列... 查看详情

如何直接在 Windows 窗体应用程序上编辑/添加/更新 datagridview

】如何直接在Windows窗体应用程序上编辑/添加/更新datagridview【英文标题】:Howtoedit/add/updatedatagridviewdirectlyonWindowsFormsApp【发布时间】:2019-10-0201:06:07【问题描述】:我正在制作一个管理酒店的Windows窗体应用程序。它有客户、房... 查看详情

c#在windows窗体datagridview单元格中承载控件

usingSystem;usingSystem.Windows.Forms;publicclassCalendarColumn:DataGridViewColumn{publicCalendarColumn():base(newCalendarCell()){}publicoverrideDataGridViewCellCellTemplate{get{returnbase.CellTemplat 查看详情

为什么在datagridview中对combobox使用自动完成时有两个列表?(代码片段)

...我的一位用户在使用该应用程序时向我展示了这一点。在datagridview中,如果他们单击下拉按钮,然后开始键入,它会覆盖原始下拉列表上的自动完成。我在这做错了什么?PrivateSubData_CreateOrder_EditingControlShowing(senderAsObjec 查看详情

强制 DataGridView 填充 SplitContainer 中的可用空间

】强制DataGridView填充SplitContainer中的可用空间【英文标题】:ForcingDataGridViewtofillavailablespaceinSplitContainer【发布时间】:2016-10-1715:30:22【问题描述】:我正在编写一个Windows窗体应用程序,该应用程序在三个可用区域中的两个区域... 查看详情

C# Windows 窗体(非 SQL):在新窗体上用整数 +1 填充 DataGridView 行中当前最高数字的文本框

】C#Windows窗体(非SQL):在新窗体上用整数+1填充DataGridView行中当前最高数字的文本框【英文标题】:C#WindowsForms(Non-SQL):Populatetextboxonnewformwithaninteger+1abovethehighestnumbercurrentlyinaDataGridViewrow【发布时间】:2022-01-1003:27:00【问题描述... 查看详情

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段

】如何在Windows窗体C#中单击按钮通过DataGridView更新数据库中的布尔字段【英文标题】:HowtoupdateBooleanfieldindatabasethroughDataGridViewbybuttonclickinWindowsFormC#【发布时间】:2017-05-1401:54:02【问题描述】:DataGridView显示我的数据库表中的值... 查看详情

如何:禁用windows窗体datagridview控件的按钮列中的按钮

转自:https://msdn.microsoft.com/zh-cn/library/ms171619(v=vs.110).aspx DataGridView 控件包括 DataGridViewButtonCell 类,其用于显示具有与按钮类似的用户界面(UI)的单元格。 但是,DataGridViewButtonCell 不提供禁用单 查看详情

如何从 c# Windows 窗体中文本框的文本内容更新 datagridview 的列

】如何从c#Windows窗体中文本框的文本内容更新datagridview的列【英文标题】:Howtoupdatethecolumnofdatagridviewfromthetextcontentsoftextboxinc#Windowsform【发布时间】:2011-01-2906:07:57【问题描述】:我有一个包含表格内容的数据网格视图。在那我... 查看详情

将数据从组合框获取到 datagridview

】将数据从组合框获取到datagridview【英文标题】:gettingdatafromcomboboxtoadatagridview【发布时间】:2010-05-1910:58:41【问题描述】:我正在使用Windows窗体应用程序。我有两个组合框,comboA和comboB。我有一个包含两列的数据网格视图。现... 查看详情

MySQL 和 C#.NET DataGridView、更新、插入和删除

】MySQL和C#.NETDataGridView、更新、插入和删除【英文标题】:MySQLandC#.NETDataGridView,Updates,InsertsandDeletes【发布时间】:2011-09-2909:24:53【问题描述】:前几天我开始使用Windows窗体在C#.NET中进行项目,距离我上次使用Windows窗体已经有一... 查看详情

如何在datagridview中显示两个人之间的关系(代码片段)

我想在datagridview(C#Windows窗体)中显示两个人之间的关系。所以,我与人做了一个(MSAccess)表。每个人都有一个唯一的编号作为PK。之后我制作了一张关系表。在这个表中,我有一个人1(FK)列,关系列和人2(FK)列。这看起... 查看详情