.NET

19 mar, 2014

VB .NET – Relacionamento entre DataGridViews – Exibindo Mestre Detalhes

Publicidade

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:

vb_dgvr11

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).

vb_dgvr14

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:

vb_dgvr12

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:

vb_dgvr13

Pegue o projeto completo aqui: DataGridView_MasterDetalhes.zip