ListView - Exibindo dados com busca dinâmica


Você já deve ter visto um controle listbox ou combobox ser preenchido com dados a medida que você digita em uma caixa de texto. Neste artigo vou mostrar como fazer a mesma coisa usando um controle ListView. Para ver artigos sobre ListView veja os artigos do site :

Nesta dica vou acessar a tabela Produtos do banco de dados Dados.mdb usado como exemplo neste caso. (è um banco de dados Access versão 2000)

- Inicie um novo projeto no VB e no formulário padrão insira os controles conforme abaixo:

- Aqui temos os seguintes controles :

- 1 TextBox - text1.text

- 2 CommandButton - command1 e command2

- 1 ListView - lstmostra

- A primeira coisa a fazer é referenciar no projeto a livraria - Microsoft ActiveX Data Object 2.x ( 2.6 ou superior)

- Na secção - General Declarations - vamos declarar as variáveis usadas no projeto:

Private Conexao As ADODB.Connection
Private Tabela As ADODB.Recordset
Private Lista As ListItem

- No evento Load do formulário vamos colocar o código para abrir o banco de dados:

Private Sub Form_Load()
Set Conexao = New ADODB.Connection
Set Tabela = New ADODB.Recordset
Banco.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Dados.mdb;"
End Sub

Observe que estou usando o provedor - Microsoft.Jet.OLEDB.4.0 - pois estamos acessando uma base de dados Access versão 2000. ( Usar um provedor anterior ao 4.0 irá provocar um erro)

- Agora , no evento - Change - da caixa de texto vamos chamar a rotina - preenche_lista - que preenche o ListView:

Private Sub Text1_Change()
   preenche_lista
End Sub

- A código principal do projeto a rotina - preenche_lista - que

Private Sub preenche_lista()
On Error Resume Next
Tabela.Close
On erro GoTo trataerro
 Tabela.Open "SELECT * FROM Produtos WHERE proDescricao LIKE '%" & Text1.Text & "%' ORDER BY proDescricao", Conexao

lstMostra.ListItems.Clear
Do While Not Tabela.EOF
   Set Lista = lstMostra.ListItems.Add(, , Tabela!proCodigo)
   Lista.SubItems(1) = Tabela!proDescricao
   Lista.SubItems(2) = Format(Tabela!proQuantidade, "#,##0.0000")
   Lista.SubItems(3) = Format(Tabela!proValor, "##,##0.00")
   Lista.SubItems(4) = Tabela!catCodigo
  Tabela.MoveNext
Loop
Exit Sub
trataerro:
   MsgBox Err.Description, vbCritical, "Erro no sistema"
End Sub

No código estamos selecionando (SELECT) todos os registros (*) da tabela produtos onde (WHERE) o campo proDescricao contiver qualquer caractere informado em Text1.text ordenado (ORDER BY) pelo campo proDescricao)

- O codigo do botão de comando - Exibir Dados - também chama a rotina preenche_lista:

Private Sub Command2_Click()
 preenche_lista
End Sub

- O código da saida do sistema limpa as variáveis e a memória:

Private Sub Form_Unload(Cancel As Integer)
  Set Lista = Nothing
  Set Tabela = Nothing
  Set Banco = Nothing
End Sub

Executando o projeto e digitando a letra M na caixa de texto teremos o resultado abaixo:

Se sua tabela tiver poucos dados e você quiser iniciar o formulário já exibindo todos eles não haverá problemas , mas se a tabela contiver 100.000 registros , carregá-los junto com a carga do formulário iria onerar muito o sistema. Para contornar isto você pode definir uma condição na instrução SQL que limite o número de registros a exibir. Algo como:

Dim criterio As String
criterio = Chr$(39) & Text1.Text & "*" & Chr(39)
If text1.text ="" Then
  criterio = Chr$(39) & "A*" & Chr$(39)
End If
SELECT * FROM Produtos WHERE proDescricao LIKE criterio ORDER BY proDescricao", Conexao

desta forma iremos exibir somente os registros com o primeiro caractere igual ao caractere A.

Para incrementar a busca no ListView , eu inclui uma caixa de texto onde você pode informar o número do item do listview que deseja selecionar. Ao pressionar o botão de comando - Selecionar o Registro - o item correspondente do controle será selecionado. O código do botão é o seguinte:

Private Sub Command3_Click()
  On Error Resume Next
  lstMostra.SelectedItem = lstMostra.ListItems(CInt(Text2.Text))
  On Error GoTo 0
  lstMostra.SetFocus
End Sub

Simples mas básico , até breve... (este artigo foi baseado em uma colaboração de : ??? )


José Carlos Macoratti