VB6 PESQUISA EM LISTVIEW
Boa tarde amigos
a uns dias venho tentando fazer uma pesquisa em items de um listview.....consegui com o codigo abaixo:
no change do textbox
porem ele so acha se e digitar o nome completo do item....preciso fazer que ele ache conforme eu va digitando......acho q nao seria esse codigo...tipo ele teria que ir filtrando conforme a palavra vai se formando no textbox....ja fiz uma vez isso mandando a pesquisa direto pro banco de dados....mas agora como o banco é enorme fica muito lento....tem como fazer direto no listview?
a uns dias venho tentando fazer uma pesquisa em items de um listview.....consegui com o codigo abaixo:
no change do textbox
Citação:Dim itm As MSComctlLib.ListItem
[ô]Set itm = ListView1.FindItem(Text1.Text, lvwSubItem)
[ô]for partial search use this:
Set itm = ListView1.FindItem(Text1.Text, lvwSubItem, , lvwPartial)
If Not itm Is Nothing Then
itm.EnsureVisible
itm.Selected = True
ListView1.SetFocus
Call pesquisa2
End If
porem ele so acha se e digitar o nome completo do item....preciso fazer que ele ache conforme eu va digitando......acho q nao seria esse codigo...tipo ele teria que ir filtrando conforme a palavra vai se formando no textbox....ja fiz uma vez isso mandando a pesquisa direto pro banco de dados....mas agora como o banco é enorme fica muito lento....tem como fazer direto no listview?
Esta rotina deve te ajudar.
Para chamar a função:
[ô]*******************************************************************
[ô] Procedimento: PesquisarListView
[ô] Argumentos : Obj As Object
[ô] -> Qualquer ListView
[ô] TextoPesquisa As String
[ô] -> Texto que será pesquisado
[ô] Onde As Integer
[ô] -> Local da pesquisa, Item ou Subitems. 0 para Item
[ô] DiferenciarLetras As Boolean
[ô] -> Diferencia letras MAIÚSCULAS de minúsculas
[ô] PalavraInteira As Boolean
[ô] -> Pesquisa somente palavra inteira ou parte dela
[ô] Retorno : Integer
[ô] -> Item onde o critério de pesquisa foi encontrado
[ô] Objetivo : Procura no ListView por itens que satisfazem o critério
[ô] de pesquisa especificado nos parâmetros da rotina
[ô]*******************************************************************
Public Function PesquisarListView(ByVal obj As Object, ByVal TextoPesquisa As String, ByVal Onde As Integer, ByVal DiferenciarLetras As Boolean, ByVal PalavraInteira As Boolean) As Integer
Dim strFindString As String [ô]Declara as variáveis
Dim strSearch As String
Dim intSubItem As Integer
Dim szList As ListItem
Dim i As Integer
PesquisarListView = 0 [ô]Atribui falha
intSubItem = Onde [ô]Passa o local da pesquisa
[ô]Inicia a pesquisa no ListView, percorre cada item da lista
For i = 1 To obj.ListItems.Count
[ô]For Each szList In obj.ListItems
Set szList = obj.ListItems(i)
szList.Selected = False [ô]Desmarca a seleção do item
[ô]Difenciar maiúsculas/minúsculas
If DiferenciarLetras Then
strFindString = TextoPesquisa [ô]Passa o texto de pesquisa
If intSubItem = 0 Then [ô]Item da lista
strSearch = szList.Text
Else [ô]Subitem da lista
strSearch = szList.SubItems(intSubItem).Caption
End If
Else
strFindString = UCase(TextoPesquisa) [ô]Passa o texto e converte as letras para maiúsculas
If intSubItem = 0 Then [ô]Item da lista
strSearch = UCase(szList.Text)
Else [ô]SubItem da Lista
strSearch = UCase(szList.SubItems(intSubItem).Caption)
End If
End If
[ô]Verifica se é com palavra inteira
If PalavraInteira Then
[ô]Encontrou
If strSearch = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
Else
[ô]Encontrou
If Left$(strSearch, Len(strFindString)) = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
End If
Next
End Function
Para chamar a função:
iIndex = PesquisarListView(ListView1, Text1.Text, 0, False, False)
If iIndex > 0 Then
ListView1.ListItems(iIndex).EnsureVisible
ListView1.ListItems(iIndex).Selected = True
ListView1.SetFocus
Call pesquisa2
End If
opa
amigo
esta dando este erro:
nesta linha:
pelo que vi a função é generica e posso usala em qualquer listview...basta especificalo no PesquisarListView.....certo?
amigo
esta dando este erro:
Citação:Invalid qualifier
nesta linha:
Citação:strSearch = UCase(szList.SubItems(intSubItem).Caption)
pelo que vi a função é generica e posso usala em qualquer listview...basta especificalo no PesquisarListView.....certo?
Consegui, alterei de
SubItems
para
ListSubItems
ai funcionou...so q tem q ser pra chamar em um botao, pq se botar no change do textbox ele ja pega a primeira letra e vai pro resultado....
so que se for a segunda palavra que esteja no campo ele nao acha...o problema eh q assim, precisaria que ele buscasse e me listasse todos os items que estao no listview que contem a palavra [Ô]TESTE[Ô] por exemplo, indiferente se ela esteja no começo ou no fim do texto...
é possivel?
SubItems
para
ListSubItems
ai funcionou...so q tem q ser pra chamar em um botao, pq se botar no change do textbox ele ja pega a primeira letra e vai pro resultado....
so que se for a segunda palavra que esteja no campo ele nao acha...o problema eh q assim, precisaria que ele buscasse e me listasse todos os items que estao no listview que contem a palavra [Ô]TESTE[Ô] por exemplo, indiferente se ela esteja no começo ou no fim do texto...
é possivel?
LuisPC,
Realmente, esta é uma função genérica para qualquer ListView.
No fim da rotina nesta parte basta você efetuar uma mudança:
Para
Realmente, esta é uma função genérica para qualquer ListView.
No fim da rotina nesta parte basta você efetuar uma mudança:
[ô]Encontrou
If Left$(strSearch, Len(strFindString)) = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
Para
[ô]Encontrou
If InStr(1, strSearch, strFindString) > 0 Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
amigo
brigadao, perfeito...
funciona de ambas as formas....mas fiz o seguinte, ele filtra primeiro no banco de dados, depois aplica sua função, ou seja...ele busca no campo observação, tudo que contiver a palavra TESTE, depois aplica a pesquisa no list view e seleciona o primeiro item da lista com essa palavra...melhor do que eu precisava..pq antes o cliente reclamava que digitava oleo e aparecia primeiro vareta de oleo...agora ele seleciona o primeiro item que tenha a palavra oleo....
precisava agora so fazer o seguinte....ele seleciona o primeiro item perfeito, mas precisava que trouxesse a barra de rolagem pra cima...
anexei um arquivo para tentar demonstrar.
teria como?
brigadao, perfeito...
funciona de ambas as formas....mas fiz o seguinte, ele filtra primeiro no banco de dados, depois aplica sua função, ou seja...ele busca no campo observação, tudo que contiver a palavra TESTE, depois aplica a pesquisa no list view e seleciona o primeiro item da lista com essa palavra...melhor do que eu precisava..pq antes o cliente reclamava que digitava oleo e aparecia primeiro vareta de oleo...agora ele seleciona o primeiro item que tenha a palavra oleo....
precisava agora so fazer o seguinte....ele seleciona o primeiro item perfeito, mas precisava que trouxesse a barra de rolagem pra cima...
anexei um arquivo para tentar demonstrar.
teria como?
Olá LuisPC,
Acho que a questão da barra de rolagem não tem uma solução muito fácil. Pois é o próprio ListView que controla a posição depois que você executa o método EnsureVisible. Talvez com uso de API você possa solucionar isso, mas não tenho ideia de qual usar.
Mas creio que isso não vá atrapalhar em nada o seu uso.
Acho que a questão da barra de rolagem não tem uma solução muito fácil. Pois é o próprio ListView que controla a posição depois que você executa o método EnsureVisible. Talvez com uso de API você possa solucionar isso, mas não tenho ideia de qual usar.
Mas creio que isso não vá atrapalhar em nada o seu uso.
boa noite
amigo, entao, como ficou o cliente ja gostou bastante, realmente como falasse da barra é complicado...mas aproveitando e nao querendo ser chato, com a função que me passasse, para ele ir filtrando conforme a palavra vai se formando, precisaria de muita alteraçao ou colocando no evento change do textbox usando a segunda opção que desse ja resolveria ?
amigo, entao, como ficou o cliente ja gostou bastante, realmente como falasse da barra é complicado...mas aproveitando e nao querendo ser chato, com a função que me passasse, para ele ir filtrando conforme a palavra vai se formando, precisaria de muita alteraçao ou colocando no evento change do textbox usando a segunda opção que desse ja resolveria ?
Tópico encerrado , respostas não são mais permitidas