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