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 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 dos 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 nome DataGridView_MestreDetalhes;

No formulário padrão inclua 3 controles DataGridView e um controle Button:

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

Joã 8:49 Jesus respondeu: Eu não tenho demônio; antes honro a meu Pai, e vós me desonrais.

Joã 8:50 Eu não busco a minha glória; há quem a busque, e julgue.

Joã 8:51 Em verdade, em verdade vos digo que, se alguém guardar a minha palavra, nunca verá a morte.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti