VB .NET - DataGridView - Obtendo informações de múltiplas linhas selecionadas


Como obter informações de múltiplas linhas selecionadas em um controle DataGridView ?

Boa pergunta garoto!!! 

Neste artigo eu mostro como realizar essa tarefa.

Além disso você vai aprender como preencher um DataGridView usando ADO .NET e também via Entity Framework para você comparar e perceber como o EF pode simplificar a sua vida.

Eu vou usar o Visual Basic 2010 Express Edition que é grátis , o banco de dados Northwin.mdb e o banco de dados Northwind.mdf.

Abra o Visual Basic 2010 Express e crie um novo projeto do tipo Windows Forms Application com o nome dgvLinhasSelecionadas;

No formulário padrão form1.vb inclua um controle DataGridView(gdvDados) com e 3 controles Button conforme o leiaute da figura a seguir:

Vamos agora definir o código do evento Click do botão ADO .NET que vai usar código ADO .NET para acessar o banco de dados Nortwhind.mdb e exibir os dados da tabela Orders no DataGridView;

Os namespaces usados para realizar o acesso via ADO .NET são:

Imports System.Data
Imports System.Data.OleDb

O código do botão é dado a seguir:

Private Sub btnAdoNet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdoNet.Click

        'define uma string de conexão
        Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Northwind.mdb"
        Dim myConnection As OleDbConnection = New OleDbConnection
        myConnection.ConnectionString = connString
        ' cria um dataadapter
        Dim da As OleDbDataAdapter = New OleDbDataAdapter("Select * from Orders", myConnection)
        ' cria um novo dataset
        Dim ds As DataSet = New DataSet
        ' preenche o dataset
        da.Fill(ds, "table")
        ' atribuir o dataste ao datagridview
        dgvDados.DataSource = ds.Tables(0)
    End Sub

Este código irá preencher o DataGridView com os dados data tabela Orders do banco de Northwind.mdb;

Para obter as linhas selecionadas vamos definir um método chamado GetSelectedRowsCollection conforme abaixo:

Private Function GetSelectedRowCollection() As List(Of String)

        If dgvDados.SelectedRows.Count > 0 Then

            Dim drc As DataGridViewSelectedRowCollection = dgvDados.SelectedRows
            Dim resultado As New List(Of String)

            For i As Integer = 0 To drc.Count - 1
                Dim id As Integer = drc(i).Cells(0).Value
                Dim valor As String = drc(i).Cells(1).Value
                resultado.Add(id.ToString & " " & valor)
            Next

            Return resultado
        Else
            Return Nothing
        End If

   End Function

Este código verifica se existem linhas selecionadas e usa DataGridViewSelectedRowCollection para obter a coleção de linhas selecionadas.

A seguir é definida uma lista de strings que é preenchida com os valores para as duas primeiras células da linha selecionada percorrendo a coleção de linhas.

O método GetSelectedRowsCollection retorna dessa forma uma lista de strings contendo os valores que obtemos da coleção das linhas selecionadas.

Para exibir o resultado vamos chamar este método no evento Click do botão Obter Linha Selecionada :

Private Sub btnSelecao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelecao.Click
        'obtem os valores das linhas selecionadas
        lista = GetSelectedRowCollection()
        If Not IsNothing(lista) Then
            'abre o formulário form2 e passa alista como parâmetro
            Dim f As New Form2(lista)
            f.Show()
        Else
            MsgBox("Não há linhas selecionadas...")
        End If
    End Sub

Observe que temos que definir uma variável lista como uma coleção de strings no início do formulário:

Dim lista As List(Of String)

Após chamar o método GetSelectedRowsCollection verificamos e a lista não é nula(nothing) e passamos a lista como parâmetro para o formulário form2.vb.

Vamos então incluir um novo formulário form2.vb no projeto e definir neste formulário um controle ListBox(lstLista) conforme o leiaute abaixo:

Neste formulário devemos definir um construtor para receber a lista de strings e em seguida percorrer a lista e exibir os seus itens conforme o código abaixo:

Public Class Form2
    Public Sub New(ByVal lista As List(Of String))
        ' This call is required by the designer.
        InitializeComponent()

        'percorre a lista de linhas selecionadas obtidas do datagridview
        'e inclui no controle ListBox
        For Each item In lista
            lstLista.Items.Add(item)
        Next
    End Sub
End Class

E o Entity Framework ?

Boa pergunta garoto.

Apenas para você sentir como fica simples o acesso a dados com a utilização deste ORM. Clique com o botão direito do mouse sobre o nome da solução e selecione a opção Add -> New Item;

A seguir selecione o template ADO .NET Entity Data Model e informe o nome Northwind.edmx e clique em Add;

Na próxima janela do assistente selecione a opção Genereate From database e clique em Next>;

A seguir defina a conexão com o banco de dados Northwind.mdf conforme abaixo:

Na próxima janela escolha a opção No para não copiar o arquivo para o projeto;

Em seguida selecione a tabela Products e marque as opções conforme a figura abaixo:

Ao final o arquivo Northwind.edmx será gerado contendo a entidade Products e todo o mapeamento para tabela Products;

Com isso já podemos acessar os dados da tabela Products do banco de dados Northwind.mdf. Para isso vamos incluir o código a seguir no evento Click do botão ENTITY FRAMEWORK;


    Private Sub btnEF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEF.Click
        'definimos uma instãncia do contexto gerado pelo ORM Entity Framework no EDM
        Dim ctx As New NORTHWNDEntities
        'atribuimos os produtos ao datagridview
        dgvDados.DataSource = ctx.Products
    End Sub

Executando a aplicação e selecionando algumas linhas do DataGridView obtemos o seguinte resultado:

Simples, simples assim...

Pegue o projeto completo aqui: dgvLinhasSelecionadas.zip

Eu sei é apenas VB .NET, mas eu gosto...

Simples, simples assim...

Referências:

José Carlos Macoratti