Пример. Создание главного и подчиненного представлений данных с использованием двух элементов управления DataGridView в Windows FormsWalkthrough: Creating a Master/Detail Form Using Two Windows Forms DataGridView Controls

Одним из наиболее распространенных сценариев использования элемента управления DataGridView является форма « основной/подробности », в которой отображается родительская или дочерняя связь между двумя таблицами базы данных.One of the most common scenarios for using the DataGridView control is the master/detail form, in which a parent/child relationship between two database tables is displayed. Выбор строк в главной таблице приводит к обновлению таблицы сведений соответствующими дочерними данными.Selecting rows in the master table causes the detail table to update with the corresponding child data.

Реализовать форму "основной/подробности" легко с помощью взаимодействия между элементом управления DataGridView и компонентом BindingSource.Implementing a master/detail form is easy using the interaction between the DataGridView control and the BindingSource component. В этом пошаговом руководстве будет построена форма с использованием двух элементов управления DataGridView и двух BindingSource компонентов.In this walkthrough, you will build the form using two DataGridView controls and two BindingSource components. В форме будут показаны две связанные таблицы в образце базы данных Northwind SQL Server: Customers и Orders.The form will show two related tables in the Northwind SQL Server sample database: Customers and Orders. По завершении вы получите форму, в которой будут показаны все клиенты базы данных в главной DataGridView и все заказы выбранного клиента в подробных DataGridView.When you are finished, you will have a form that shows all the customers in the database in the master DataGridView and all the orders for the selected customer in the detail DataGridView.

Чтобы скопировать код из этого раздела в виде одного списка, см. раздел как создать форму "основной/подробности" с помощью двух элементов управления Windows Forms DataGridView.To copy the code in this topic as a single listing, see How to: Create a Master/Detail Form Using Two Windows Forms DataGridView Controls.

предварительные требованияPrerequisites

Для выполнения задач этого руководства необходимы:In order to complete this walkthrough, you will need:

  • Доступ к серверу с образцом базы данных Northwind SQL Server.Access to a server that has the Northwind SQL Server sample database.

Создание формыCreating the form

Создание формы «основной/подробности»To create a master/detail form

  1. Создайте класс, производный от Form и содержащий два элемента управления DataGridView и два BindingSource компонентов.Create a class that derives from Form and contains two DataGridView controls and two BindingSource components. Следующий код обеспечивает базовую инициализацию формы и включает метод Main.The following code provides basic form initialization and includes a Main method. Если вы используете конструктор Visual Studio для создания формы, вместо этого кода можно использовать созданный конструктором код, но обязательно используйте имена, показанные в объявлениях переменных.If you use the Visual Studio designer to create your form, you can use the designer generated code instead of this code, but be sure to use the names shown in the variable declarations here.

    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";
        }
    
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        Private masterDataGridView As New DataGridView()
        Private masterBindingSource As New BindingSource()
        Private detailsDataGridView As New DataGridView()
        Private detailsBindingSource As New BindingSource()
    
        <STAThreadAttribute()> _
        Public Shared Sub Main()
            Application.Run(New Form1())
        End Sub
    
        ' Initializes the form.
        Public Sub New()
    
            masterDataGridView.Dock = DockStyle.Fill
            detailsDataGridView.Dock = DockStyle.Fill
    
            Dim splitContainer1 As New SplitContainer()
            splitContainer1.Dock = DockStyle.Fill
            splitContainer1.Orientation = Orientation.Horizontal
            splitContainer1.Panel1.Controls.Add(masterDataGridView)
            splitContainer1.Panel2.Controls.Add(detailsDataGridView)
    
            Me.Controls.Add(splitContainer1)
            Me.Text = "DataGridView master/detail demo"
    
        End Sub
    
    }
    
    End Class
    
  2. Реализуйте метод в определении класса формы для обработки сведений о подключении к базе данных.Implement a method in your form's class definition for handling the detail of connecting to the database. В этом примере используется метод GetData, который заполняет объект DataSet, добавляет объект DataRelation в набор данных и связывает компоненты BindingSource.This example uses a GetData method that populates a DataSet object, adds a DataRelation object to the data set, and binds the BindingSource components. Убедитесь, что переменной connectionString присвоено значение, соответствующее базе данных.Be sure to set the connectionString variable to a value that is appropriate for your database.

    Важно!

    Хранение конфиденциальных сведений (например, пароля) в строке подключения может повлиять на безопасность приложения.Storing sensitive information, such as a password, within the connection string can affect the security of your application. Использование проверки подлинности Windows (также называемой встроенными средствами безопасности) — более безопасный способ управления доступом к базе данных.Using Windows Authentication (also known as integrated security) is a more secure way to control access to a database. Дополнительные сведения см. в разделе Защита сведений о подключении.For more information, see Protecting Connection Information.

    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.");
        }
    }
    
    Private Sub 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.
            Dim connectionString As String = _
                "Integrated Security=SSPI;Persist Security Info=False;" & _
                "Initial Catalog=Northwind;Data Source=localhost"
            Dim connection As New SqlConnection(connectionString)
    
            ' Create a DataSet.
            Dim data As New DataSet()
            data.Locale = System.Globalization.CultureInfo.InvariantCulture
    
            ' Add data from the Customers table to the DataSet.
            Dim masterDataAdapter As _
                New SqlDataAdapter("select * from Customers", connection)
            masterDataAdapter.Fill(data, "Customers")
    
            ' Add data from the Orders table to the DataSet.
            Dim detailsDataAdapter As _
                New SqlDataAdapter("select * from Orders", connection)
            detailsDataAdapter.Fill(data, "Orders")
    
            ' Establish a relationship between the two tables.
            Dim relation As 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 ex As SqlException
            MessageBox.Show("To run this example, replace the value of the " & _
                "connectionString variable with a connection string that is " & _
                "valid for your system.")
        End Try
    
    End Sub
    
  3. Реализуйте обработчик для события Load формы, которое привязывает элементы управления DataGridView к BindingSourceным компонентам и вызывает метод GetData.Implement a handler for your form's Load event that binds the DataGridView controls to the BindingSource components and calls the GetData method. Следующий пример включает в себя код, который изменяет размер DataGridView столбцов в соответствии с отображаемыми данными.The following example includes code that resizes DataGridView columns to fit the displayed data.

    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;
    }
    
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
    
        ' 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
    
    End Sub
    

Тестирование приложенияTesting the Application

Теперь можно проверить форму, чтобы убедиться, что она ведет себя так, как ожидалось.You can now test the form to make sure it behaves as expected.

Тестирование формыTo test the form

  • Скомпилируйте и запустите приложение.Compile and run the application.

    Вы увидите два элемента управления DataGridView, один над другим.You will see two DataGridView controls, one above the other. В верхней части представлены клиенты из таблицы Northwind Customers, а внизу — Orders, соответствующий выбранному клиенту.On top are the customers from the Northwind Customers table, and at the bottom are the Orders corresponding to the selected customer. При выборе различных строк в верхнем DataGridViewсодержимое нижнего DataGridView меняется соответствующим образом.As you select different rows in the upper DataGridView, the contents of the lower DataGridView change accordingly.

Next StepsNext Steps

Это приложение предоставляет базовое представление о возможностях элемента управления DataGridView.This application gives you a basic understanding of the DataGridView control's capabilities. Внешний вид и поведение элемента управления DataGridView можно настроить несколькими способами.You can customize the appearance and behavior of the DataGridView control in several ways:

См. также разделSee also