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: