VB .NET – Relacionamento entre DataGridViews – Exibindo Mestre Detalhes
Neste artigo vamos recordar como podemos definir relacionamentos entre os controles DataGridView e tabelas de um banco de dados Microsoft Access.
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












