Neste artigo vamos recordar como podemos definir relacionamentos entre os controles DataGridView e tabelas de um banco de dados Microsoft Access, de forma a exibir um relacionamento mestre detalhes.
Vamos usar como exemplo o banco de dados Northwind.mdb, o nosso saco de pancadas, que desde os tempos do Visual Basic é usado como exemplo em diversos artigos.
Abaixo vemos o relacionamento entre as tabelas do banco de dados Northwind.mdb:
Nosso objetivo será exibir em um controle DataGridView todos os funcionários (Employees) e outro DataGridView os pedidos (Orders) e em um último DataGridView os detalhes dos pedidos (Order Details).
Vou usar o Visual Studio 2013 Professional e criar um projeto do tipo Windows Forms Application usando a linguagem Visual Basic com o nomeDataGridView_MestreDetalhes.
No formulário padrão inclua três controles DataGridView e um controle Button:
- dgvFuncionarios
- dgvPedidos
- dgvDetalhesPedidos
- btnExibir
Defina o seguinte leiaute no formulário:
Agora no evento Click do botão de comando inclua o código abaixo:
Private Sub btnExibir_Click(sender As Object, e As EventArgs) Handles btnExibir.Click Dim ds As DataSet Using conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Northwind.mdb") ds = New DataSet Dim daEmployees = New OleDbDataAdapter("Select * from Employees", conn) Dim daOrders = New OleDbDataAdapter("Select * from Orders", conn) Dim daOrderDetails = New OleDbDataAdapter("Select * from [Order Details]", conn) daEmployees.Fill(ds, "Employee") daOrders.Fill(ds, "Orders") daOrderDetails.Fill(ds, "OrderDetails") End Using ds.Relations.Add("EmployeeOrder", ds.Tables("Employee").Columns("EmployeeID"), _ ds.Tables("Orders").Columns("EmployeeID")) ds.Relations.Add("Order2Details", ds.Tables("Orders").Columns("OrderID"), _ ds.Tables("OrderDetails").Columns("OrderID")) dgvFuncionarios.DataSource = ds dgvFuncionarios.DataMember = "Employee" dgvPedidos.DataSource = ds dgvPedidos.DataMember = "Employee.EmployeeOrder" dgvDetalhesPedidos.DataSource = ds dgvDetalhesPedidos.DataMember = "Employee.EmployeeOrder.Order2Details" End Sub
O código responsável por essa ‘mágica’ é definido pela propriedade Relations do DataSet, que obtém a coleção relações que vinculam tabelas e permitem a navegação de tabelas pai para as tabelas filho.
ds.Relations.Add("EmployeeOrder", ds.Tables("Employee").Columns("EmployeeID"), ds.Tables("Orders").Columns("EmployeeID"))
ds.Relations.Add("Order2Details", ds.Tables("Orders").Columns("OrderID"), ds.Tables("OrderDetails").Columns("OrderID"))
Depois basta usar as propriedades DataSource e DataMember de cada DataGridView para exibir os dados relacionados:
dgvFuncionarios.DataSource = ds dgvFuncionarios.DataMember = "Employee" dgvPedidos.DataSource = ds dgvPedidos.DataMember = "Employee.EmployeeOrder" dgvDetalhesPedidos.DataSource = ds dgvDetalhesPedidos.DataMember = "Employee.EmployeeOrder.Order2Details"
A seguir, vemos o projeto em execução exibindo os dados relacionados em cada DataGridView:
Pegue o projeto completo aqui: DataGridView_MasterDetalhes.zip