VB.NET - Exibindo dados com ListView


Neste espaço irei mostrar mais uma forma de você exibir dados usando o controle ListView. Para enriquecer ainda mais o artigo irei criar um projeto onde teremos duas combobox sincronizadas que permitem selecionar os dados da tabela Customers e da tabela Orders do banco de dados Northwind.mdb.

Este exemplo refere-se ao artigo: VB.NET  -  O controle ListView Revisitado.

Você já deve saber que existe um relacionamento entre estas tabelas (veja figura abaixo):

O relacionamento entre as tabelas é do tipo Um-para-Muitos onde cada cliente possui muitos pedidos.

O relacionamento é efetivado pelo campo CustomerID

A idéia é selecionar o Código do cliente (CustomerID) na primeira ComboBox e ter preenchida a segunda combobox com os pedidos relativos ao cliente selecionado.

Abaixo temos a tela principal da aplicação :

A aplicação usa os controles:Combobox, GroupBox, Button e ListView

- Ao executar a aplicação teremos a primeira combobox preenchida com o código do clientes da tabela Customers

- Ao selecionar um código de cliente na primeira combobox a segunda combobox será preenchida com os pedidos deste cliente

Para incluir os dados no controle ListView basta clicar no botão de comando.

Perceba que estamos exibindo o nome cliente e a quantidade de pedidos.

1- Crie um novo projeto no VS2003 do tipo WIndows Applicaton usando a linguagem VB.NET chamando de vbnListView.

2- A seguir no formulário padrão form1.vb inclua, conforme o leiaute acima, os controles : GroupBox, Combobox , Button e ListView

3- Como estamos acessando uma base de dados Access iremos usar o namespace System.Data.OleDb

Imports System.Data.Oledb

4- A seguir vamos definir as variáveis objetos que serão visíveis no projeto:

Dim cn As OleDbConnection
Dim dsDados As DataSet
Dim daClientes As OleDbDataAdapter
Dim daPedidos As OleDbDataAdapter
Dim i As Integer = 0

Acima temos um objeto Connection , um DataSet dois DataAdapters e um inteiro.

No evento Load do formulário iremos carregar os dados das tabelas e exibir nas Combobox. O código da rotina Carregar que é executada no evento Load é dado a seguir:

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

'Nova instancia da cadeia de conexão

cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\teste\Northwind.mdb")


'define um Adaptador

daClientes = New OleDbDataAdapter("select customerid, companyname, contactname from customers", cn)


'cria uma Instancia do dataset

dsDados = New DataSet


'preencher o DataSet clientes

daClientes.Fill(dsDados, "Customers")


'Define a origem do Combo Clientes

Me.cboClientes.DataSource = dsDados.Tables("Customers")

Me.cboClientes.DisplayMember = dsDados.Tables("Customers").Columns("CustomerId").ToString

Me.cboClientes.SelectedIndex = 0


lblCliente.Text = dsDados.Tables("Customers").Rows(
Me.cboClientes.SelectedIndex)("CompanyName").ToString


'Cria a tabela com pedidos

daPedidos = New OleDbDataAdapter("select orderid, customerid, orderdate, freight from orders", cn)


'preenche dataset pedidos

daPedidos.Fill(dsDados, "Orders")


'Origem da combo pedidos

Me.cboPedidos.DataSource = dsDados.Tables("Orders")

Me.cboPedidos.DisplayMember = dsDados.Tables("Orders").Columns("OrderId").ToString

Me.cboPedidos.SelectedIndex = 0


'conta os itens na combo que será o total de pedidos

grpPedidos.Text = Me.cboPedidos.Items.Count.ToString + " pedidos"


'Mostrar o outro combo - Filtrar

Me.filtraPedidos()
 

lblquantidade.Text = Me.cboPedidos.Items.Count.ToString + " pedidos"


End
Sub

No código acima criamos dois dataadapters: um para clientes e outro para pedidos e preenchemos o dataset dsDados.

A rot4ina filtraPedidos() irá filtrar os dados a serem exibidos na combobox pedidos usando um objeto DataView e o código do cliente. Abaixo temos o código para esta rotina:

Private Sub filtraPedidos()

'filtra os dados do dataview exibindo desta forma somente os pedidos cujo cliente tenha codigo
'igual a definida na combo anterior

Dim dvPedidos As New DataView(dsDados.Tables("Orders"))

dvPedidos.RowFilter = "CustomerId = '" & Me.cboClientes.Text & "'"

'atribui a o valor do dataview a combo pedidos
Me.cboPedidos.DataSource = dvPedidos

End Sub

A seguir veremos o código da rotina SelecionarCliente que será executada quando o evento SelectedIndexChanged for disparado, ou seja, quando houver uma seleção feita no combo Clientes (cboClientes)

Private Sub SelecionarCliente(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboClientes.SelectedIndexChanged

filtraPedidos()

lblCliente.Text = dsDados.Tables("Customers").Rows(Me.cboClientes.SelectedIndex)("CompanyName").ToString

lblquantidade.Text = Me.cboPedidos.Items.Count.ToString + " pedidos"

End Sub

Note que para cada seleção contamos a quantidade de itens na combobox pela propriedade Count e exibimos ao lado da mesma.

Quando o usuário clica no botão de comando iremos incluir no ListView os dados referentes ao nome do cliente e da quantidade dos pedidos relacionados. Abaixo o código :

Private Sub btnIncluirLv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluirLv.Click

   incluirListView()

End Sub

O código da rotina incluirListView() é dado a seguir:

Private Sub incluirListView()

Me.ListView1.Items.Add(dsDados.Tables("Customers").Rows(cboClientes.SelectedIndex)("CompanyName").ToString)
Me.ListView1.Items(i).SubItems.Add(Me.cboPedidos.Items.Count.ToString + " pedidos")

i += 1

End Sub

Pegue o código do projeto completo aqui : vbnListView.zip

Até o próximo artigo... 


José Carlos Macoratti