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.Oledb4- A seguir vamos definir as variáveis objetos que serão visíveis no projeto:
Dim
cn As OleDbConnectionAcima 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
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 pedidosMe.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").ToStringlblquantidade.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