Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um dos cenários mais comuns para usar o controle DataGridView é o formulário mestre/detalhe, no qual uma relação pai/filho entre duas tabelas de banco de dados é exibida. Selecionar linhas na tabela mestre faz com que a tabela de detalhes sejam atualizadas com os dados filho correspondentes.
Implementar um formulário mestre/detalhe é fácil usando a interação entre o controle DataGridView e o componente BindingSource. Neste passo a passo, você criará o formulário usando dois controles DataGridView e dois componentes BindingSource. O formulário mostrará duas tabelas relacionadas no banco de dados de exemplo do Northwind SQL Server: Customers e Orders. Quando terminar, você terá um formulário que mostra todos os clientes no banco de dados na seção mestre DataGridView e todos os pedidos para o cliente selecionado na seção de detalhes DataGridView.
Para copiar o código neste tópico como uma única listagem, consulte Como criar um formulário Mestre/Detalhe usando dois controles DataGridView do Windows Forms.
Pré-requisitos
Para concluir este passo a passo, você precisará de:
- Acesso a um servidor que tem o banco de dados de exemplo do Northwind SQL Server.
Criando o formulário
Para criar um formulário de detalhes/mestre
Crie uma classe que deriva de Form e contenha dois controles DataGridView e dois componentes BindingSource. O código a seguir fornece inicialização de formulário básica e inclui um método
Main. Se você usar o designer do Visual Studio para criar seu formulário, poderá usar o código gerado pelo designer em vez desse código, mas use os nomes mostrados nas declarações de variável aqui.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 ClassImplemente um método na definição de classe do formulário para lidar com os detalhes de conexão com o banco de dados. Este exemplo usa um método
GetDataque preenche um objeto DataSet, adiciona um objeto DataRelation ao conjunto de dados e associa os componentes BindingSource. Defina a variávelconnectionStringcomo um valor apropriado para seu banco de dados.Importante
Armazenar informações confidenciais, como uma senha, dentro da cadeia de conexão pode afetar a segurança do aplicativo. Usar a Autenticação do Windows (também conhecida como segurança integrada) é uma maneira mais segura de controlar o acesso a um banco de dados. Para obter mais informações, consulte Protegendo informações de conexão.
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 SubImplemente um manipulador para o evento Load do formulário que associa os controles DataGridView aos componentes BindingSource e chama o método
GetData. O exemplo a seguir inclui código que redimensiona DataGridView colunas para ajustar os dados exibidos.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
Testando o aplicativo
Agora você pode testar o formulário para garantir que ele se comporte conforme o esperado.
Para testar o formulário
Compile e execute o aplicativo.
Você verá dois controles DataGridView, um acima do outro. Na parte superior estão os clientes da tabela
Customersda Northwind e na parte inferior estão osOrderscorrespondentes ao cliente selecionado. À medida que você seleciona linhas diferentes no DataGridViewsuperior, o conteúdo da DataGridView inferior é alterado correspondentemente.
Próximas etapas
Este aplicativo fornece uma compreensão básica dos recursos do controle DataGridView. Você pode personalizar a aparência e o comportamento do controle DataGridView de várias maneiras:
Alterar estilos de borda e cabeçalho. Para obter mais informações, consulte Como alterar os estilos de borda e linha de grade no controle DataGridView do Windows Forms.
Habilite ou restrinja a entrada do usuário ao controle DataGridView. Para obter mais informações, consulte Como impedir a adição e exclusão de linha no controle DataGridView do Windows Formse Como fazer colunas Read-Only no controle DataGridView do Windows Forms.
Valide a entrada do usuário para o controle DataGridView. Para obter mais informações, consulte Passo a passo: validando dados no controle DataGridView do Windows Forms.
Manipule conjuntos de dados muito grandes usando o modo virtual. Para obter mais informações, consulte Passo a passo: implementando o modo virtual no controle DataGridView do Windows Forms.
Personalize a aparência das células. Para obter mais informações, consulte Como personalizar a aparência das células no controle DataGridView dos Windows Forms e Como definir estilos de célula padrão para o controle DataGridView dos Windows Forms.
Consulte também
.NET Desktop feedback