Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Implementar Pesquisa numa Listview

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:

Anónimo disse...

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

Unknown disse...

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

Anónimo disse...

Tem como usar em exce? Como faço?

Anónimo disse...

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

Jorge Paulino disse...

Este código é para VB.NET e não para VBA

Anónimo disse...

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



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico