Pesquisa em listview

redshot

ElectroUser
Boas. Como é que se faz uma pesquisa numa listview, do género de se carregar numa tecla e só aparecem os itens cujo nome começa por essa letra, e vai filtrando? Tal como a pesquisa de programas do iniciar do Vista.
 
Supondo que tens uma colecção de itens onde procurar, fazes um ciclo que percorre todos os itens e adicionas à listview aqueles que verificarem a condição de pesquisa.
 
Dica: Usa a função InStr

MSDN:
InStr

Description

Returns the position of the first occurrence of one string within another.
Syntax

InStr([Start, ]string1, string2[, compare])

Start - Optional. Numeric expression that sets the Starting position for each search. If omitted, search begins at the first character position. If Start contains Null, an error occurs. The Start argument is required if compare is specified.
string1 - Required. String expression being searched.
string2 - Required. String expression searched for.
compare - Optional. Numeric value indicating the kind of comparison to use when evaluating substrings. See Settings section for values. If omitted, a binary comparison is performed.
 
Última edição:
Numa listview não é nada fácil (aliás bastante dificil e demorado mesmo).

Uma coisa é procurar uma palavra ou filtrar de acordo com uma palavra. Mas para isso tens de explicar melhor o que queres e como queres.

E é em que versão de VB ?

fmorais90
InStr é só para pesquisar texto numa string e o listview já tem algumas funções para isso tipo Me.ListView1.FindItemWithText("TextoProcurar") ... caso seja VB.NET !!!
 
Numa listview não é nada fácil (aliás bastante dificil e demorado mesmo).

Uma coisa é procurar uma palavra ou filtrar de acordo com uma palavra. Mas para isso tens de explicar melhor o que queres e como queres.

E é em que versão de VB ?

fmorais90
InStr é só para pesquisar texto numa string e o listview já tem algumas funções para isso tipo Me.ListView1.FindItemWithText("TextoProcurar") ... caso seja VB.NET !!!

Certo... mas por acaso fiz há pouco tempo um projecto em VB6 e usei o InStr...
Funciona perfeitamente...

Código:
Private Sub txtPesquisa_Change()
     Listar_Clientes
     If txtPesquisa.Text <> "" Then
          x = 1
          y = lstClientes.ListItems.Count
          While (x <= y)
               If ((optNome.Value = True) And ((InStr(UCase(lstClientes.ListItems.Item(x)), UCase(txtPesquisa.Text)) > 0))) Then GoTo Fim
               If ((optNIF.Value = True) And ((InStr(lstClientes.ListItems.Item(x).ListSubItems.Item(1), Val(txtPesquisa.Text)) > 0))) Then GoTo Fim
               lstClientes.ListItems.Remove (x)
               x = x - 1
               y = y - 1
          Fim:
               x = x + 1
          Wend
     End If
End Sub

Acho que é mesmo isto que ele quer... como no Vista...
 
>> Certo... mas por acaso fiz há pouco tempo um projecto em VB6 e usei o InStr...
Funciona perfeitamente...

Sim, mas com o teu código o que fazes é remover os items da lista. Imagina na pesquisa da palavra "exemplo". Quando carregar em "e" apagas todos os item que não tenham a palavra "e". Depois carregas em "x" e apagar todos os que não tenham a palavra "ex".

Agora o problema: E se apagares o x (porque te enganaste a escrever) ? Tens de carregar todos os items e voltar a "filtrar".

O que eu quero dizer é que a listview não se podem fazer filtros simples, no entanto pode servir dependendo do fim a que se que atingir.

Pessoalmente utilizo uma textbox e um botão de pesquisa.
 
>> Certo... mas por acaso fiz há pouco tempo um projecto em VB6 e usei o InStr...
Funciona perfeitamente...

Sim, mas com o teu código o que fazes é remover os items da lista. Imagina na pesquisa da palavra "exemplo". Quando carregar em "e" apagas todos os item que não tenham a palavra "e". Depois carregas em "x" e apagar todos os que não tenham a palavra "ex".

Agora o problema: E se apagares o x (porque te enganaste a escrever) ? Tens de carregar todos os items e voltar a "filtrar".

O que eu quero dizer é que a listview não se podem fazer filtros simples, no entanto pode servir dependendo do fim a que se que atingir.

Pessoalmente utilizo uma textbox e um botão de pesquisa.

Não.. como é no evento change da textbox ele vê sempre o texto da textbox...
Se apagar o 'x' e ficar só com o 'e' ele filtra pelo só pelo 'e'....
Acho que fica mais simples do que ter um botão pesquisar e não ver os dados que vão ficando pelo caminho com o filtro...
Não sei se me fiz entender xDD
 
Provavelmente até percebi mal, mas se apagas os itens da lista como é que os colocas lá ?

Tudo bem que está no textchange event mas .... os apagas tens de voltar a coloca-los para poderes filtrar novamente.

Mas vou testar o teu código.
 
Provavelmente até percebi mal, mas se apagas os itens da lista como é que os colocas lá ?

Tudo bem que está no textchange event mas .... os apagas tens de voltar a coloca-los para poderes filtrar novamente.

Mas vou testar o teu código.

Pois.. acho que não me expliquei bem...
Na função Listar_Clientes faço um select à BD e preencho o listview.. por isso cada vez que o texto da textbox muda o select é feito de novo e a listview preenchida com os dados de acordo com o filtro da textbox.. acho que foi isso que não percebeste...
 
Estou a utilizar o Visual Basic 2005 Express Edition.

fmorais90: É uma coisa desse género. Vou testar esse código. Só não percebi o que é o optNome e o optNif.
 
Última edição:
Estou a utilizar o Visual Basic 2005 Express Edition.

fmorais90: É uma coisa desse género. Vou testar esse código. Só não percebi o que é o optNome e o optNif.

Esses opt são os OptionButton (ou RadioButton) que eu tenho para quando é para pesquisar pelo nome ou pelo NIF.. dependendo do que está seleccionado..
 
Back
Topo