Exemplarische Vorgehensweise: Erstellen eines Master-/Detailformulars mit zwei DataGridView-Steuerelementen in Windows FormsWalkthrough: Creating a Master/Detail Form Using Two Windows Forms DataGridView Controls

Eines der gängigsten Szenarien für die Verwendung des DataGridView -Steuer Elements ist das Master- /Detailformular, in dem eine Beziehung zwischen über-und untergeordneten Elementen zwischen zwei Datenbanktabellen angezeigt wird.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. Das Auswählen von Zeilen in der Master Tabelle bewirkt, dass die Detail Tabelle mit den entsprechenden untergeordneten Daten aktualisiert wird.Selecting rows in the master table causes the detail table to update with the corresponding child data.

Das Implementieren eines Master-/Detailformulars ist einfach, indem die DataGridView Interaktion zwischen dem BindingSource Steuerelement und der Komponente verwendet wird.Implementing a master/detail form is easy using the interaction between the DataGridView control and the BindingSource component. In dieser exemplarischen Vorgehensweise erstellen Sie das Formular mit zwei DataGridView Steuerelementen und BindingSource zwei Komponenten.In this walkthrough, you will build the form using two DataGridView controls and two BindingSource components. Im Formular werden zwei verknüpfte Tabellen in der Beispieldatenbank Northwind SQL Server angezeigt Customers : Ordersund.The form will show two related tables in the Northwind SQL Server sample database: Customers and Orders. Wenn Sie fertig sind, verfügen Sie über ein Formular, in dem alle Kunden in der Datenbank in der Master DataGridView -Datenbank und alle Bestellungen für den ausgewählten Kunden im DataGridViewDetail angezeigt werden.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.

Zum Kopieren des Codes in diesem Thema als einzelne Auflistung lesen Sie Vorgehensweise: Erstellen Sie ein Master-/Detailformular mit zwei Windows Forms DataGridView-Steuerelementen.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.

Erforderliche KomponentenPrerequisites

Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:In order to complete this walkthrough, you will need:

  • Zugriff auf einen Server mit der Beispieldatenbank Northwind SQL Server.Access to a server that has the Northwind SQL Server sample database.

Erstellen des FormularsCreating the form

So erstellen Sie ein Master-/DetailformularTo create a master/detail form

  1. Erstellen Sie eine Klasse, die Form von abgeleitet wird DataGridView und zwei- BindingSource Steuerelemente und zwei-Komponenten enthält.Create a class that derives from Form and contains two DataGridView controls and two BindingSource components. Der folgende Code stellt die grundlegende Formular Initialisierung bereit Main und enthält eine-Methode.The following code provides basic form initialization and includes a Main method. Wenn Sie den Visual Studio-Designer verwenden, um das Formular zu erstellen, können Sie den vom Designer generierten Code anstelle dieses Codes verwenden, aber achten Sie darauf, die in den Variablen Deklarationen gezeigten Namen zu verwenden.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. Implementieren Sie eine Methode in der Klassendefinition Ihres Formulars, um die Details der Verbindungs Herstellung mit der Datenbank zu verarbeiten.Implement a method in your form's class definition for handling the detail of connecting to the database. In diesem Beispiel wird GetData eine Methode verwendet, die DataSet ein-Objekt auffüllt, dem Dataset ein DataRelation -Objekt hinzufügt BindingSource und die Komponenten bindet.This example uses a GetData method that populates a DataSet object, adds a DataRelation object to the data set, and binds the BindingSource components. Sorgen Sie dafür, dass die connectionString-Variable auf einen Wert gesetzt wird, der für Ihre Datenbank geeignet ist.Be sure to set the connectionString variable to a value that is appropriate for your database.

    Wichtig

    Das Speichern vertraulicher Informationen (z. B. eines Kennworts) innerhalb der Verbindungszeichenfolge kann die Sicherheit einer Anwendung beeinträchtigen.Storing sensitive information, such as a password, within the connection string can affect the security of your application. Der Zugriff auf eine Datenbank lässt sich mithilfe der Windows-Authentifizierung (wird auch als integrierte Sicherheit bezeichnet) sicherer steuern.Using Windows Authentication (also known as integrated security) is a more secure way to control access to a database. Weitere Informationen finden Sie unter Protecting Connection Information (Schützen von Verbindungsinformationen).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. Implementieren Sie einen Handler für das- Load Ereignis des Formulars, DataGridView das die Steuer BindingSource Elemente an die- GetData Komponenten bindet und die-Methode aufruft.Implement a handler for your form's Load event that binds the DataGridView controls to the BindingSource components and calls the GetData method. Das folgende Beispiel enthält Code, mit dem DataGridView die Größe der Spalten an die angezeigten Daten angepasst wird.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
    

Testen der AnwendungTesting the Application

Sie können das Formular jetzt testen, um sicherzustellen, dass das Verhalten wie erwartet ausfällt.You can now test the form to make sure it behaves as expected.

So testen Sie das FormularTo test the form

  • Kompilieren Sie die Anwendung, und führen Sie sie aus.Compile and run the application.

    Es werden zwei DataGridView Steuerelemente angezeigt, von denen eine über der anderen ist.You will see two DataGridView controls, one above the other. Im oberen Bereich sind die Kunden aus der Northwind Customers -Tabelle, und im unteren Bereich Orders sind die Kunden, die dem ausgewählten Kunden entsprechen.On top are the customers from the Northwind Customers table, and at the bottom are the Orders corresponding to the selected customer. Wenn Sie im oberen DataGridViewAbschnitt verschiedene Zeilen auswählen, wird der Inhalt der unteren DataGridView Änderung entsprechend geändert.As you select different rows in the upper DataGridView, the contents of the lower DataGridView change accordingly.

Nächste SchritteNext Steps

Diese Anwendung enthält grundlegende Kenntnisse über die DataGridView Funktionen des-Steuer Elements.This application gives you a basic understanding of the DataGridView control's capabilities. Sie können die Darstellung und das Verhalten des DataGridView Steuer Elements auf verschiedene Weise anpassen:You can customize the appearance and behavior of the DataGridView control in several ways:

Siehe auchSee also