VB.NET - Usando ListView com uma base de dados


A plataforma .NET realmente facilitou a vida de quem precisa acessar banco de dados, além de fornecer controles mais robustos e com muitas propriedades , seu conjunto de classes para acesso a dados presentes no namespace System.Data oferece diversos recursos poderosos.

Neste artigo vou mostrar como podemos usar alguns destes controles e classes de acesso a dados para gerenciar dados e um base de dados Access.

Neste artigo vamos usar os seguintes controles:

Vamos usar também o namespace System.Data.OleDb que irá fornecer as classes para acesso a um banco de dados Access.

Nosso objetivo será exibir os dados da tabela Orders (Pedidos) do banco de dados Northwind.mdb usando os controles acima citados.

Teremos que exibir três visões dos dados:

Teríamos então que ter as seguintes visões dos dados da tabela Orders.

Exibindo todos os registros da tabela Orders
Exibindo os Pedidos para um Cliente
Exibindo os Pedidos para um Pais.

É claro que queremos obter este resultado usando um interface amigável onde o usuário possa obter o resultado de forma dinâmica.

Vamos então construir esta interface usando o controle TabControl e o controle ListView.

Inicie um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET ; dê ao projeto o nome de listViewBD.(ou qualquer outro nome que julgue pertinente)

Altere também a propriedade Name do formulário para frmPedidos.

No formulário padrão inclua (arraste e solte) o controle TabControl a partir da caixa de ferramentas (ToolBox).

Vamos agora criar três abas no controle TabControl. Para isto selecione o controle e na janela de propriedades localize a propriedade TagPages ; clique no botão com os três pontos para  criar e atribuir nomes para as três abas que vamos criar. Veja a figura abaixo:

- Altere a propriedade Name do controle para tabPedidos.

Vamos definir o namespace a ser usado e as variáveis de acesso aos dados. Abaixo temos estas declarações:

A declaração dos namespaces usados deve ser feita no início do projeto.

Imports System.Data.Oledb

Definição das variáveis que deve ser feita no início do formulário.

'Definicão das variáveis de acesso aos dados
Dim cn As OleDbConnection

'Adaptadores
Dim daPedidos As OleDbDataAdapter
Dim daClientes As OleDbDataAdapter
Dim daPais As OleDbDataAdapter

'DataSet
Dim ds As DataSet

Vamos selecionar a aba Pedidos e incluir no controle TabControl o componente ListView e um botão de comando, conforme a figura abaixo:

Nome dos controles :

ListView - lvPedidos
Button - btnPedidos

Altere as seguintes Propriedades do listView lvPedidos conforme abaixo:

View = Details
GridLines = True
FullRowSelect = True

figura 1.0 - Exibindo todos os Pedidos  

Selecione a seguir a aba - Pedidos por Cliente e inclua os controles : ListView , button e Combobox, conforme figura a seguir:

Nome dos controles:

ListView : lvClientes
ComboBox : cboClientes
button : btnClientes

Altere as seguintes Propriedades do listView lvClientes conforme abaixo:

View = Details
GridLines = True
FullRowSelect = True

 

Figura 2.0 -  Exibindo os Pedidos por Cliente  

Selecione a última aba e inclua os controles : ListView , Button e Combobox, conforme figura a seguir:

Nome dos controles:

ListView : lvPais
ComboBox : cboPais
button : btnPais

Altere as seguintes Propriedades do listView lvPais conforme abaixo:

View = Details
GridLines = True
FullRowSelect = True

 

Figura 3.0 - Exibindo os Pedidos por País  

Agora vamos definir para cada controle ListView as colunas que vamos exibir. Por uma questão de escolha eu vou exibir somente os seguintes campos da tabela Orders:

Agora , para todos os controles ListView do projeto , selecione a propriedade Columns e clique no botão (Collection). A seguir informe o nome e o tamanho da coluna conforme a figura abaixo:

Clique no botão OK para encerrar. Você deverá obter o seguinte resultado :

Vamos agora por a mão na massa ou seja no código que irá fazer tudo isto funcionar.

NO evento Load do formulário que iremos chamar de CarregarDados vamos incluir o código abaixo:

Private Sub CarregarDados(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim conexao As String

        'define a string de conexao 
        conexao = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\teste\Northwind.mdb"

        'cria o objeto connection
        cn = New OleDbConnection(conexao)

        'Instancia dos adaptadores : um para cada tabela
        daPedidos = New OleDbDataAdapter("Select * from Orders", cn)
        daClientes = New OleDbDataAdapter("Select * from Customers", cn)
        daPais = New OleDbDataAdapter("Select * from Paises", cn)

     'Instancia e preenche o dataset
     Try
            ds = New DataSet
            daPedidos.Fill(ds, "Orders")
            daClientes.Fill(ds, "Customers")
            daPais.Fill(ds, "Paises")
     Catch ex As Exception
            MsgBox(ex.Message)
     End Try
       'preenche a combobox com os clientes
        cboClientes.DataSource = ds.Tables("Customers")
        cboClientes.DisplayMember = ds.Tables("Customers").Columns("CompanyName").ToString
        cboClientes.ValueMember = ds.Tables("Customers").Columns("CustomerID").ToString

        'preenche a combobox com os paises (Como eu não estou usando o codigo do Pais na tabela Orders este código não irá usar
        'o campo PaisID . Ao invés disto vamos obter o texto da combobox que será o nome do Pais.
        cboPais.DataSource = ds.Tables("Paises")
        cboPais.DisplayMember = ds.Tables("Paises").Columns("NomePais").ToString
        cboPais.ValueMember = ds.Tables("Paises").Columns("PaisID").ToString
    End Sub

 

Este código , que já esta comentado,  ira preencher os controles combobox com os dados das tabelas Customers e Paises (esta tabela eu criei para o artigo ela não existe no banco de dados Northwind.mdb)

Na interface da figura 1.0 vamos incluir o seguinte código no evento click do botão - Exibir pedidos :

Private Sub btnPedidos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPedidos.Click

        'limpa os itens do listview
        lvPedidos.Items.Clear()
        Dim i As Integer

        'percorre a tabela pedidos e preenche o listview
        For i = 0 To ds.Tables("Pedidos").Rows.Count - 1
            lvPedidos.Items.Add(ds.Tables("Pedidos").Rows(i)("OrderID"))
            lvPedidos.Items(i).SubItems.Add(ds.Tables("Pedidos").Rows(i)("ShipName"))
            lvPedidos.Items(i).SubItems.Add(ds.Tables("Pedidos").Rows(i)("ShipAddress"))
            lvPedidos.Items(i).SubItems.Add(ds.Tables("Pedidos").Rows(i)("ShipCity"))
            lvPedidos.Items(i).SubItems.Add(ds.Tables("Pedidos").Rows(i)("ShipCountry"))
        Next
    End Sub

 

  
O resultado da execução do projeto quando o usuário clicar no botão : Exibir Pedidos , será:
 


Para a interface da figura 2.0 , onde iremos exibir os dados para um determinado cliente, devemos incluir o código abaixo no evento Click do botão : Selecione um Cliente:

Private Sub btnClientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClientes.Click

        Dim strCliente As String = cboClientes.SelectedValue
        Dim SQL As String = "Select * from Orders where CustomerID = '" & strCliente & "'"
        Dim daClientes As New OleDbDataAdapter(SQL, cn)
        Try
            daClientes.Fill(ds, "Clientes")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        lvClientes.Items.Clear()

        Dim i As Integer
       'percorre a tabela pedidos e preenche o listview
        For i = 0 To ds.Tables("Clientes").Rows.Count - 1
            lvClientes.Items.Add(ds.Tables("Clientes").Rows(i)("OrderID"))
            lvClientes.Items(i).SubItems.Add(ds.Tables("Clientes").Rows(i)("ShipName"))
            lvClientes.Items(i).SubItems.Add(ds.Tables("Clientes").Rows(i)("ShipAddress"))
            lvClientes.Items(i).SubItems.Add(ds.Tables("Clientes").Rows(i)("ShipCity"))
            lvClientes.Items(i).SubItems.Add(ds.Tables("Clientes").Rows(i)("ShipCountry"))
        Next

        ds.Tables("Clientes").Clear()

    End Sub

 

O resultado obtido quando da execução do projeto é exibido na tela abaixo:

 

O código da interface da figura 3.0, onde iremos exibir os dados do pedido para um Pais, temo seguinte código colocado no evento click do botão - Selecione um Pais:

 

Private Sub btnPais_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPais.Click

        'obtem o texto da combobox selecionado
        Dim strPais As String = cboPais.Text
        'seleciona os pedidos para o pais indicado
        Dim SQL As String = "Select * from Orders where ShipCountry = '" & strPais & "'"
        Dim daPais As New OleDbDataAdapter(SQL, cn)
        daPais.Fill(ds, "Pais")

        Try
            daPais.Fill(ds, "Pais")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        lvPais.Items.Clear()

        Dim i As Integer
 
       'percorre a tabela pedidos e preenche o listview
        For i = 0 To ds.Tables("Pais").Rows.Count - 1
            lvPais.Items.Add(ds.Tables("Pais").Rows(i)("OrderID"))
            lvPais.Items(i).SubItems.Add(ds.Tables("Pais").Rows(i)("ShipName"))
            lvPais.Items(i).SubItems.Add(ds.Tables("Pais").Rows(i)("ShipAddress"))
            lvPais.Items(i).SubItems.Add(ds.Tables("Pais").Rows(i)("ShipCity"))
            lvPais.Items(i).SubItems.Add(ds.Tables("Pais").Rows(i)("ShipCountry"))
        Next
        ds.Tables("Pais").Clear()

    End Sub

O resultado da execução do projeto e seleção de um Pais será a seguinte tela:

Você viu que é tudo muito simples e fácil de fazer. Você consegue gerenciar dados usando interfaces gráficas com um resultado satisfatório.

Agora vamos ser sincero , oh código engessado esse que criamos , não é mesmo ???  Você não acha que pode melhorar este código ???

Vou deixar alguns questionamentos para você refletir ?

Eu não poderia ter usado um DataReader ? (é mais rápido.)

Dá para eu remover o código do formulário e criar classes ? (fica mais fácil manter)

O tratamento de erros não poderia ser mais robusto ?


Agora é com você... Pegue o projeto completo aqui : listViewBD.zip

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

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti