使用 DataGridView 控件的一种最常见方案是“主/详细信息”窗体,这样的窗体可显示两个数据库表之间的父/子关系。如果选择主表中的行,将导致以相应的子数据来更新详细信息表。
主/详细信息窗体很容易实现,这需要使用 DataGridView 控件和 BindingSource 组件之间的交互。在本演练中,将使用两个 DataGridView 控件和两个 BindingSource 组件来生成窗体。窗体将显示 Northwind SQL Server 示例数据库中的两个相关表:Customers 和 Orders。完成后,将得到一个窗体,它可以在主 DataGridView 中显示数据库中的所有客户,并在详细信息 DataGridView 中显示所选客户的所有订单。
创建窗体
创建主/详细信息窗体
-
创建一个从 Form 派生的类,该类包含两个 DataGridView 控件和两个 BindingSource 组件。下面的代码提供了基本的窗体初始化,并包含一个 Main 方法。如果使用 Visual Studio 设计器来创建窗体,则可以使用设计器生成的代码而不是这里的代码,但一定要使用这里的变量声明中显示的名称。
-
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";
}
} -
在窗体的类定义中实现一个方法,用于处理有关与数据库的连接的详细信息。此示例使用 GetData 方法来填充 DataSet 对象,并向数据集添加 DataRelation 对象,还要绑定 BindingSource 组件。务必将 connectionString 变量设置为适用于您的数据库的值,将敏感信息(如密码)存储在连接字符串中可能会影响应用程序的安全性。若要控制对数据库的访问,一种较为安全的方法是使用 Windows 身份验证(也称为集成安全性)。有关更多信息,请参见保护连接字符串。 -
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.");
}
}
-
为窗体的 Load 事件实现一个处理程序,该事件将 DataGridView 控件绑定到 BindingSource 组件,并调用 GetData 方法。下面的示例所包括的代码可以调整 DataGridView 列的大小,以容纳所显示的数据。
-
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;
}