VB .NET - DataGridView extraindo linhas selecionadas


Hoje vamos aprender como extrair informações sobre as linhas selecionadas de um controle DataGridView.

Para fazer isso vou usar a classe DataGridViewSelectedRowCollection que representa um coleção de objetos DataGridViewRow que são selecionadas em um controle DataGridView.

Vou usar também a propriedade SelectedRows que representa uma coleção de linhas selecionadas pelo usuário em um DataGridView.

A propriedade SelectionMode deve ser definida como FullRowSelect ou RowHeaderSelect para que a propriedade SelectedRows seja preenchida com as linhas selecionadas.

Para poder selecionar mais de uma linha a propriedade MultiSelect deve ser definida com o valor True.

Esta propriedade contém um instantâneo somente leitura da seleção no momento em que é referenciada. Se o usuário mudar a seleção o valor anterior não representa mais o valor atual.

Para selecionar uma linha via programação você tem que definir a propriedade Selected como True.

Criando a solução Windows Forms

Abra o Visual Studio 2012 Express for desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application informando o nome DataGridView_LinhasSelecionadas;

Inclua os seguintes controles a partir da Toolbox no formulário form1.vb;

Disponha os controles no formulário conforme o leiaute abaixo:

Para preencher o controle GridView vou usar a tabela Funcionarios de um banco de dados Microsoft Access que eu criei para esse fim. A estrutura e os dados da tabela é mostrada abaixo

No menu PROJECT clique em Add Class e informe o nome AcessoDados.vb e a seguir inclua o código abaixo nesta classe:

Imports System.Data
Imports System.Data.OleDb

Public Class AcessoDados

    Public Shared Function GetDados() As DataTable
        Dim con As OledbConnection = Nothing
        Try
            'define a string de conexao com provedor caminho e nome do banco de dados
            Dim strProvider As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados\Funcionarios.mdb"
            'define a instrução SQL
            Dim strSql As String = "SELECT * FROM Funcionarios"
            'cria a conexão com o banco de dados
            con =  New OleDbConnection(strProvider)
            'cria o objeto command para executar a instruçao sql
            Dim cmd As New OleDbCommand(strSql, con)

            'abre a conexao
            con.Open()

            'define o tipo do comando
            cmd.CommandType = CommandType.Text
            'cria um dataadapter
            Dim da As New OleDbDataAdapter(cmd)

            'cria um objeto datatable
            Dim dt As New DataTable()
            'preenche o datatable via dataadapter
            da.Fill(dt)
            'retorna o datable
            Return dt
        Catch ex As Exception
            Throw ex
          Finally
            con.Close()
        End Try
    End Function

End Class

No evento Load do formulário vamos carregar o controle DataGridView com os dados da tabela Funcionarios usando o método GetDados da classe AcessoDados. Como o método foi declarado estático (shared) não precisamos criar uma instância da classe para acessá-lo.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        dgvDados.DataSource = AcessoDados.GetDados()
End Sub

No evento Click do botão de comando - Pegar Linhas Selecionadas - inclua o código que obtém as linhas selecionados chamando a função GetLinhasSelecionadas():

  Private Sub btnPegarLinhas_Click(sender As Object, e As EventArgs) Handles btnPegarLinhas.Click
        lbSelecao.Items.Clear()
        Try
            lblmsg.Text = "Linhas Selecionadas : " + dgvDados.SelectedRows.Count.ToString
            For Each item In GetLinhasSelecionadas()
                lbSelecao.Items.Add(item)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

A função GetLinhasSelecionadas() usa a classe DataGridViewSelectedRowCollection para obter a coleção das linhas selecionadas a partir dela extraímos as informações desejadas.

No exemplo estou extraindo os valores para o ID, nome e endereço do funcionário e exibindo o resultado em um controle ListBox:

 Private Function GetLinhasSelecionadas() As List(Of String)

        If dgvDados.SelectedRows.Count > 0 Then
            Dim dgvColecaoLinhasSelecionadas As DataGridViewSelectedRowCollection = dgvDados.SelectedRows
            Dim ids As New List(Of String)
            For i As Integer = 0 To dgvColecaoLinhasSelecionadas.Count - 1
                Dim id As Integer = dgvColecaoLinhasSelecionadas(i).Cells(0).Value
                Dim nome As String = dgvColecaoLinhasSelecionadas(i).Cells(1).Value
                Dim endereco As String = dgvColecaoLinhasSelecionadas(i).Cells(2).Value
                ids.Add(id.ToString & "," & nome & " " & endereco)
            Next
            Return ids
        Else
            Throw New Exception("Não existem linhas selecionadas !!")
        End If

    End Function

Executando o projeto e selecionando algumas linhas teremos o seguinte resultado:

Você pode fazer o que quiser com a informação acessada extraindo as linhas para um arquivo texto, um arquivo csv, etc.

Pegue o projeto completo aqui: DataGridView_LinhasSelecionada.zip

João 12:23 Respondeu-lhes Jesus: É chegada a hora de ser glorificado o Filho do homem.

João 12:24 Em verdade, em verdade vos digo: Se o grão de trigo caindo na terra não morrer, fica ele só; mas se morrer, dá muito fruto.

João 12:25 Quem ama a sua vida, perdê-la-á; e quem neste mundo odeia a a sua vida, guardá-la-á para a vida eterna.

Referências:


José Carlos Macoratti