A ListView é um controlo
bastante utilizado para mostrar informação de várias fontes de dados, sejam elas
bases de dados, ficheiros xml ou mesmo ficheiros de texto. Existem outros controlos
que possíbilitam este tipo de visualização, como é o caso da datagridview, listbox,
etc, mas por ser simples de utilizar e muito versátil a listview é ainda bastante
utilizada.
A pesquisa de informação
é algo muito prático em qualquer controlo, principalmente quando está disponível
muita informação. O método mais aconselhável para fazer, principalmente quando se
utiliza bases de dados, é filtrar a informação que se adiciona à lista através de
uma select query. No entanto, e por diversos
motivos, é por vezes necessário implementar um pesquisa na própria lista.
No seguinte exemplo vou
mostrar uma implementação simples de uma pesquisa, colocando o item encontrado no
topo da lista, preenchendo também a lista com alguns dados aleatórios.

Para a execução de uma
pesquisa simples pode-se utilizar a função FindItemWithText
da listview, mas esta apenas pesquisa no início do texto. Exemplo:
Me.ListView1.FindItemWithText("Texto A Pesquisar", True,
0)
Para o exemplo vamos
preencher e configurar a lista no evento Form Load e declarar uma variável privada:
' lastIndex serve para identificar a posição (index) do ultimo item encontrado para
' não encontrar sempre o mesmo. Sem isto iria aparecer sempre o primeiro a encontrar
Private lastIndex
As Integer
Private
Sub Form1_Load(ByVal sender
As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Load
Dim str() As
String = {"visual",
"basic", "exemplo",
"dados", "vbtuga",
"teste",
"vb.net", _
"pesquisa", "studio",
"listview", "microsoft",
"2005"}
Dim item As ListViewItem
Dim rnd As
New Random()
' Define as colunas e propriedades
da lista
With Me.ListView1
.Columns.Add("ID",
50, HorizontalAlignment.Left)
.Columns.Add("Item",
100, HorizontalAlignment.Left)
.Columns.Add("Descrição
(dados aleatórios)", 250, HorizontalAlignment.Left)
.FullRowSelect =
True
.GridLines =
True
.View = View.Details
End With
' Inicia um ciclo que irá preencher
a listview
For x As
Byte = 0 To 100
item = New
ListViewItem
item.Text = x.ToString
item.SubItems.Add("Item
" + x.ToString)
' Selecciona aleatóriamente
três valores do array
' criado para permitar pesquisas diferentes
Dim arrayLenght As Byte
= str.Length - 1
Dim itemString As
String = _
String.Format("{0}
{1} {2} {3}", _
str(rnd.Next(arrayLenght)),
str(rnd.Next(arrayLenght)), _
str(rnd.Next(arrayLenght)),
str(rnd.Next(arrayLenght)))
item.SubItems.Add(itemString)
' Adiciona o item
à lista
Me.ListView1.Items.Add(item)
Next
End
Sub
Depois
vamos adicionar a seguinte função que irá ser a responsável pelo ciclo nos items/sub-items:
''' <summary>
''' Pesquisa por um item numa listview e devolve o ListViewItem
''' </summary>
''' <param name="lvName">Nome da ListView</param>
''' <param name="lvSearchString">Texto a procurar</param>
Private
Function FindListViewText(ByVal lvName As ListView, ByVal
lvSearchString As String)
As ListViewItem
Dim result As ListViewItem = Nothing
' Ciclo nos items da lista
For Each item
As ListViewItem In lvName.Items
' Ciclo nos sub items da lista
For
Each subitem As ListViewItem.ListViewSubItem
In item.SubItems
' Verifica se o texto de pesquisa existe e se o index é diferente
If subitem.Text.ToUpper.Contains(lvSearchString.ToUpper)
And lastIndex <>
item.Index Then
lastIndex = item.Index
Return item
End If
Next
Next
' Caso não encontre
lastIndex = 0
Return result
End
Function
Finalmente o botão responsável
por iníciar a pesquisa:
Private
Sub btnSearch_Click(ByVal sender
As System.Object, ByVal e
As System.EventArgs) Handles btnSearch.Click
' Pesquisa na listview com base na
informação de uma TextBox
Dim itemSearch As ListViewItem
= FindListViewText(Me.ListView1,
Me.TextBox1.Text.ToString)
' Caso tenha encontrado o item
If itemSearch IsNot
Nothing Then
' Posiciona a lista indicando
a selecção
Me.ListView1.TopItem = itemSearch
Else
'Caso não encontre mostra uma
mensagem de informação
Dim str As
String = "Não foi encontrado nenhum item na lisview!"
MessageBox.Show(str,
"Pesquisa na ListView", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End
Sub
Este é apenas um pequeno
exemplo podendo-se depois acrescentar funcionalidades como por exemplo, colorir
a linha encontrada, apagar o item, etc, etc.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
6 comentários:
Oi. Bom blog. Mesmo muito bom. Parabens!
Mas olha se eu tiver já uma datagridview e quiser fazer a pesquisa na datagridview como é o código?e como se põe então a(s) coluna(s) encontrada(s) a cor?
Abraços
Olá Alexandra,
Em primeiro lugar obrigado pelo comentário. É importante essa motivação!
Em segundo penso que a cor deve ser nas linhas e não nas colunas. Estou certo ? Podes enviar-me um email para vbtuga(at)gmail.com que eu disponibilizo-te o código. Mais tarde coloco essa pesquisa aqui no blog porque estou a terminar outros artigos.
Para terminar não te esqueças de divulgar!
Cumprimentos,
Jorge Paulino
Tem como usar em exce? Como faço?
Boa Tarde,
Não estou a conseguir implementar este codigo vba.
Alguem me pode enviar um exemplo para o meu e-mail:
norbertoferreira921@hotmail.com
Agradeço muito,
NF
Este código é para VB.NET e não para VBA
Caro JPaulino,
Consegue-me dar um sitio na net onde consiga arranjar um bom exemplo, ou até mesmo para download de um exemplo?
Cump.
NJ
Enviar um comentário