Tutorial: Crear un formulario maestro y detalle mediante dos controles DataGridView de formularios Windows Forms
Uno de los escenarios más comunes para usar el control DataGridView es el formulario maestro/detalle, en el que se muestra una relación principal o secundaria entre dos tablas de base de datos. La selección de filas en la tabla maestra hace que la tabla de detalles se actualice con los datos secundarios correspondientes.
La implementación de un formulario maestro/detalle es fácil mediante la interacción entre el control DataGridView y el componente BindingSource. En este tutorial, creará el formulario con dos controles DataGridView y dos componentes BindingSource. El formulario mostrará dos tablas relacionadas en la base de datos de ejemplo Northwind de SQL Server: Customers
y Orders
. Cuando haya terminado, tendrá un formulario que muestra todos los clientes de la base de datos del maestro DataGridView y todos los pedidos del cliente seleccionado en el detalle DataGridView.
Para copiar el código de este tema como una sola lista, vea Tutorial: Crear un formulario maestro y detalle mediante dos controles DataGridView de formularios Windows Forms.
Requisitos previos
Para poder completar este tutorial, necesitará:
- Acceso a un servidor que tenga la base de datos de ejemplo de Northwind SQL Server.
Creación del formulario
Para crear un formulario maestro/detalle
Cree una clase que se derive de Form y contenga dos controles DataGridView y dos componentes BindingSource. El código siguiente proporciona inicialización básica de formularios e incluye un método
Main
. Si usa el diseñador de Visual Studio para crear el formulario, puede usar el código generado por el diseñador en lugar de este código, pero asegúrese de usar los nombres que se muestran en las declaraciones de variables aquí.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
Implemente un método en la definición de clase del formulario para controlar los detalles de la conexión a la base de datos. En este ejemplo se usa un método
GetData
que rellena un objeto DataSet, se agrega un objeto DataRelation al conjunto de datos y se enlazan los componentes BindingSource. Asegúrese de establecer la variableconnectionString
en un valor que sea adecuado para la base de datos.Importante
Almacenar información confidencial, como una contraseña, en la cadena de conexión puede afectar a la seguridad de la aplicación. El uso de la autenticación de Windows (también conocida como seguridad integrada) es un modo más seguro de controlar el acceso a una base de datos. Para más información, consulte Proteger la información de conexión.
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
Implemente un controlador para el evento Load del formulario que enlaza los controles DataGridView a los componentes BindingSource y llama al método
GetData
. En el ejemplo siguiente se incluye código que cambia el tamaño de las columnas DataGridView para ajustarse a los datos mostrados.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
Probar la aplicación
Puede comprobar el formulario para asegurarse de que se comporta de la forma prevista.
Para comprobar el formulario
Compile y ejecute la aplicación.
Verá dos controles DataGridView, uno encima del otro. En la parte superior, los clientes de la tabla
Customers
de Northwind y, en la parte inferior, los valoresOrders
correspondientes al cliente seleccionado. A medida que selecciona filas diferentes en el elemento DataGridView de la parte superior, el contenido de DataGridView de la parte inferior cambia en consecuencia.
Pasos siguientes
Esta aplicación le ofrece una comprensión básica de las capacidades del control DataGridView. Puede personalizar la apariencia y el comportamiento del control DataGridView de varias maneras:
Cambie los estilos de borde y encabezado. Para obtener más información, vea Cómo: Cambiar los estilos de borde y línea de la cuadrícula en el control DataGridView de formularios Windows Forms.
Habilite o restrinja la entrada del usuario al control DataGridView. Para más información, vea Cómo: Evitar la adición y eliminación de filas en el control DataGridView de formularios Windows Forms, y Cómo: Crear columnas de solo lectura en el control DataGridView de formularios Windows Forms.
Valide la entrada del usuario en el control DataGridView. Para obtener más información, consulte Tutorial: Validar datos en el control DataGridView de formularios Windows Forms.
Controle conjuntos de datos muy grandes mediante el modo virtual. Para obtener mas información, vea Tutorial: Implementar el modo virtual en el control DataGridView de formularios Windows Forms.
Personalizar la apariencia de las celdas. Para obtener más información, vea Cómo: Personalizar la apariencia de las celdas en el control DataGridView de formularios Windows Forms y Cómo: Establecer estilos de celda predeterminados para el control DataGridView de formularios Windows Forms.
Vea también
.NET Desktop feedback
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de