Exemplarische Vorgehensweise: Erstellen eines Master-/Detailformulars mit zwei DataGridView-Steuerelementen in Windows Forms
Eines der gängigsten Beispiele für die Verwendung des DataGridView-Steuerelements ist das Master/Detail-Formular, auf dem eine Beziehung zwischen über- und untergeordneten Datenbanktabellen angezeigt wird. Wenn Sie Zeilen in der Mastertabelle auswählen, wird die Detailtabelle mit den entsprechenden untergeordneten Daten aktualisiert.
Ein Master/Detail-Formular lässt sich durch die Interaktion zwischen DataGridView-Steuerelement und BindingSource-Komponente mühelos implementieren. In dieser exemplarischen Vorgehensweise erstellen Sie das Formular mit je zwei DataGridView-Steuerelementen und BindingSource-Komponenten. Das Formular zeigt zwei verwandte Tabellen in der SQL Server-Beispieldatenbank Northwind: Customers
und Orders
. Wenn Sie fertig sind, haben Sie ein Formular, auf dem alle Kunden in der Datenbank im Master-DataGridView und alle Bestellungen des ausgewählten Kunden im Detail-DataGridView zu sehen sind.
Informationen zum Kopieren des Codes in diesem Thema als einzelne Auflistung finden Sie unter Vorgehensweise: Erstellen eines Master/Detail-Formulars mithilfe zweier DataGridView-Steuerelemente in Windows Forms.
Voraussetzungen
Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:
- Zugriff auf einen Server mit der SQL Server-Beispieldatenbank „Northwind“.
Erstellen des Formulars
So erstellen Sie ein Master-/Detail-Formular
Erstellen Sie eine Klasse, die sich von Form ableitet und je zwei DataGridView-Steuerelemente und BindingSource-Komponenten enthält. Der folgende Code ermöglicht eine einfache Initialisierung des Formulars und enthält eine
Main
-Methode. Wenn Sie Ihr Formular im Visual Studio-Designer erstellen, können Sie anstelle dieses Codes den vom Designer generierten Code verwenden. Achten Sie jedoch darauf, dass Sie die hier in den Variablendeklarationen angegebenen Namen verwenden.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
Implementieren Sie eine Methode in der Klassendefinition Ihres Formulars für die Behandlung der Details der Verbindung mit der Datenbank. In diesem Beispiel wird eine
GetData
-Methode verwendet, die ein DataSet-Objekt auffüllt, ein DataRelation-Objekt zum Dataset hinzufügt und die BindingSource-Komponenten bindet. Sorgen Sie dafür, dass dieconnectionString
-Variable auf einen Wert gesetzt wird, der für Ihre Datenbank geeignet ist.Wichtig
Das Speichern vertraulicher Informationen (z. B. eines Kennworts) innerhalb der Verbindungszeichenfolge kann die Sicherheit einer Anwendung beeinträchtigen. Der Zugriff auf eine Datenbank lässt sich mithilfe der Windows-Authentifizierung (wird auch als integrierte Sicherheit bezeichnet) sicherer steuern. Weitere Informationen finden Sie unter Protecting Connection Information (Schützen von Verbindungsinformationen).
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
Implementieren Sie einen Handler für das Load-Ereignis Ihres Formulars, der die DataGridView-Steuerelemente an die BindingSource-Komponenten bindet und die
GetData
-Methode aufruft. Das folgende Beispiel enthält Code, der die Größe der DataGridView-Spalten an die angezeigten Daten anpasst.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 Anwendung
Sie können das Formular jetzt testen, um sicherzustellen, dass das Verhalten wie erwartet ausfällt.
So testen Sie das Formular
Kompilieren Sie die Anwendung, und führen Sie sie aus.
Sie sehen nun zwei DataGridView-Steuerelemente, eines über dem anderen. Oben befinden sich die Kunden aus der Northwind-Tabelle
Customers
, unten dieOrders
, die dem ausgewählten Kunden entsprechen. Wenn Sie verschiedene Zeilen im oberen DataGridView auswählen, ändert sich der Inhalt des unteren DataGridView entsprechend.
Nächste Schritte
Diese Anwendung vermittelt Ihnen ein grundlegendes Verständnis der Funktionen des DataGridView-Steuerelements. Sie können das Aussehen und Verhalten des DataGridView -Steuerelements auf verschiedene Weise anpassen:
Ändern Sie die Rahmen- und Kopfzeilenformate. Weitere Informationen finden Sie unter Vorgehensweise: Ändern des Rahmen- und Rasterlinienstils im DataGridView-Steuerelement in Windows Forms.
Aktivieren oder beschränken Sie die Benutzereingabe für das DataGridView-Steuerelement. Weitere Informationen finden Sie unter Vorgehensweise: Verhindern, das Zeilen im DataGridView-Steuerelement in Windows Forms hinzugefügt und gelöscht werden und Vorgehensweise: Zuweisen von schreibgeschützten Spalten im DataGridView-Steuerelement in Windows Forms.
Überprüfen Sie die Benutzereingabe für das DataGridView-Steuerelement. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms.
Verarbeiten Sie sehr große Datasets mithilfe des virtuellen Modus. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Implementieren des virtuellen Modus im DataGridView-Steuerelement in Windows Forms.
Passen Sie die Darstellung der Zellen an. Weitere Informationen finden Sie unter Vorgehensweise: Anpassen der Darstellung von Zellen im DataGridView-Steuerelement von Windows Forms und Vorgehensweise: Festlegen von Standardzellenformaten für das DataGridView-Steuerelement von Windows Forms.
Weitere Informationen
.NET Desktop feedback
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für