Usando o Controle Listview


Muitas vezes , ao desenvolver um projeto , a primeira preocupação é fazer a coisa funcionar , somente depois é que vamos tratar de dar uma melhorada na interface. O controle ListView é muito interessante para exibir dados em diversos formatos e dar uma aparência mais profissional á sua aplicação. Dê uma olhada no artigo - Usando ListView com ADO.

O controle ListView contém os objetos ListItem e ColumnHeader. O objeto ListItem  define as características de um item , assim:

Podemos escolher quatro maneiras diferentes para nossos itens de dados em um controle ListView. Os itens podem ser arranjados em colunas com ou sem cabeçalhos de colunas e temos a opção de exibir os itens acompanhados de imagens e texto.

A lista de itens de dados é tratada pelo objeto ListItem nos seguintes formatos:

  1. - A propriedade View determina qual a forma de visão será usada para exibir os itens na lista.
  2. - A propriedade labelWrap permite controlar como o texto associado ao item será exibido.
  3. - A propriedade HideColumnHeader permite exibir ou não os cabeçalhos das colunas na lista.

- O controle ListView é encontrado no arquivo MSCOMCTL.OCX e para poder utilizá-lo no seu projeto você deve referenciar o componente - Microsoft Windows Commons Controls 6.0 (SP3 ou SP4) no seu projeto.

Exibindo itens em um controle Listview

Para poder exibir qualquer coisa em um controle Listview temos que primeiro incluir itens no controle. Como já dissemos acima o objeto ListItem é quem vai permitir tratar os itens em um controle ListView. Assim temos que:

Então o objeto ListItem pode conter imagens e texto , sendo que as imagens deve ser referências em um controle ImageList através das propriedades: Icons e SmallIcons.

Para poder exibir um item em um controle ListView criamos um objeto do tipo ListItem a seguir criamos o item. Assim, temos:

Exemplo 1:

Dim Item As ListItem

 

Set item = ListView1.ListItems.Add(,,"Item 1")

Set item = ListView1.ListItems.Add(,,"Item 2")

Set item = ListView1.ListItems.Add(,,"Item 3")

Se você quiser associar uma imagem ao item deverá usar um Controle ImageList   e vincular este controle ao controle ListView.

Após inserir as imagens que deseja usar no controle ImageList você deve indicar no controle ListView o nome do controle ImageList usado para fazer a vinculação:

Controle ImageList - Imagem a ser exibida no ListView Controle ListView - Indicando o nome do Controle Imagelist
Assim , após feita esta configuração basta alterar o código do Exemplo 1 para :
Exemplo 2: 
Dim Item As ListItem

 

Set item = ListView1.ListItems.Add(,,"Item 1",1,1)

Set item = ListView1.ListItems.Add(,,"Item 2",1,1)

Set item = ListView1.ListItems.Add(,,"Item 3",1,1)

Inclusão de três itens no ListView, relacionados com as imagens em ImagList:  indices 1 para icones grandes e 1 p/pequenos

 Para alterar a visão dos dados basta alterar a propriedade View do Controle ListView, assim temos os seguintes formatos - Exemplo 3:

ListView1.View = lvwIcon ListView1.View = lvwReport

ListView1.View = lvwList ListView1.View = lvwSmallIcon
Inserindo Colunas e subitens
Para incluir colunas e cabeçalhos usamos o objeto ColumnHeader . Assim 

Obs: O objeto ColumnHeader somente pode ser visualizado no formato Report ( View=Report) e pode ser inserido em tempo de projeto ou de execução.

Você pode usar o objeto ColumnHeader para:

  1. Disparar o evento ColumnClick quando o usuário clicar no cabeçalho e ordernar os itens baseado em um critério.
  2. Esconder os objetos ColumnHeader
  3. Ajustar a largura das colunas usando o mouse

Note que :

- Sempre existe uma coluna no Controle ListView : a coluna 1. Esta coluna contém os objetos ListItem atuais e não os seus subitens.

- A segunda coluna ( coluna 2) contém subitens

- Você sempre terá um objeto ColumnHeader a mais que subitens a propriedade Subitems do objetos ListItem começa em 1. As colunas então serão em quantidades ColumnHeaders.Count -1 .

- O número de objetos ColumnHeader determina o número de subitens que cada objeto ListItem pode ter. Quando você exclui um objeto ColumnHeader , todos os subitens associados a esta coluna serão excluídos.

Para incluir colunas você deve primeiro definir um objeto do tipo ColumnHeader e então usar o método Add para incluir os cabeçalhos com texto no controle ListView.

Para incluir um subitem usamos a propriedade Subitem com a seguinte sintaxe:

object.SubItems(index) [= string]

Onde:

Parte Descrição
object Um objeto ListItem.
index Um inteiro que identifica um subitem para um ListItem específico.
string Texto que descreve o subitem.

Note que:
  1. Subitens são arrays de strings representando um dado do objeto ListItem que é exibido na visão Report.
  2. Cada Subitem possui uma coluna de cabeçalho correspondente
  3. Não podemos incluir elementos diretamente no array subitems. Usamos o método Add da coleção ColumnHeaders para incluir subitens.

 A seguir um exemplo de código onde incluímos um cabeçalho e subitens usando o mesmo ícone para todos os itens:

Private Sub Form_Load()
   Dim clmX As ColumnHeader
   Dim itmX As ListItem
   Dim i As Integer

   For i = 1 To 3
      Set clmX = ListView1.ColumnHeaders.Add()
      clmX.Text = "Coluna " & i
   Next i
   
   ' Inclui 10 items com o mesmo ícone
   For i = 1 To 10
      Set itmX = ListView1.ListItems.Add()
      itmX.SmallIcon = 1
      itmX.Text = "ListItem " & i
      itmX.SubItems(1) = "Subitem 1"
      itmX.SubItems(2) = "Subitem 2"
   Next i
End Sub	

Trabalhando com Subitens

Para acessar e definir subitens primeiro temos que inserir colunas como fizemos nos exemplos anteriores. O acesso é feito na coleção Subitem de um ListItem. Quando você inclui um item o texto que você associa a ele irá aparecer na coluna com índice 0 ( Column(0) ). Então para inserir textos nas outras colunas precisamos apenas atribuir o texto a cada subitem.

Veja o exemplo abaixo, onde incluímos as colunas e depois definimos cada subitem para cada coluna com seu texto associado. (Usamos também um controle ImageList para associar a imagem exibida ao item)

Private Sub Command1_Click()

Dim itmx As ListItem
Dim colx As ColumnHeader

'Inclui algumas colunas
Set colx = ListView1.ColumnHeaders.Add(, , "Nome")
Set colx = ListView1.ColumnHeaders.Add(, , "Tipo")
Set colx = ListView1.ColumnHeaders.Add(, , "Tam.")
Set colx = ListView1.ColumnHeaders.Add(, , "Data")

'Inclui um item
Set itmx = ListView1.ListItems.Add(, , "Aluno.exe", 1, 1)

'Aqui estamos acessando e definindo cada subitem
itmx.SubItems(1) = "Arquivo"
itmx.SubItems(2) = "15 KB"
itmx.SubItems(3) = "01/04/2001"

'Define o formato de visao como Report
ListView1.View = lvwReport

End Sub

O resultado do processamento é o seguinte:

Principais Eventos

Dentre os eventos do controle ListView dois você tem que conhecer: o evento ItemClick , o evento ItemCheck e o evento ColumnClick.

- ItemClick - é disparado quando um item é clicado e retorna o objeto ListItem que foi clicado , então você pode exibir o texto associado ao item  , assim :

    Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
        MsgBox Item.Text
    End Sub

- ItemChecked - É usado quando você define o controle para mostrar checkboxes ao lado de cada item. Para fazer isto via código fazemos:

    ListView1.Checkboxes = True

Quando o usuário clicar,  marcando ou desmarcando , um checkbox você vai usar o evento ItemCheck para fazer alguma ação , veja exemplo a seguir:

    Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
        If Item.Checked Then
            MsgBox "Item marcado"
        Else
            MsgBox "Item desmarcado"
        End If
    End Sub

- ColumnClick - Este evento ocorre quando um objeto ColumnHeader é clicado ;  está disponível somente no formato de visão Report.

Você pode usar este evento associado  as propriedades Sorted , SortKey e SortOrder para realizar uma ordenação pela coluna clicada. Veja exemplo a seguir:

Private Sub Form_Load()
Dim itmx As ListItem
Dim colx As ColumnHeader

'Inclui algumas colunas
Set colx = ListView1.ColumnHeaders.Add(, , "Coluna 1")
Set colx = ListView1.ColumnHeaders.Add(, , "Coluna 2")

'Inclui alguns itens
Set itmx = ListView1.ListItems.Add(, , "ABC")
itmx.SubItems(1) = "XYZ"

Set itmx = ListView1.ListItems.Add(, , "XYZ")
itmx.SubItems(1) = "ABC"

'Define o formato de visao como report
ListView1.View = lvwReport
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

'Verifica se SortKey é a mesma que a atual
If ListView1.SortKey <> ColumnHeader.Index - 1 Then
'Quando clicar em uma coluna define sortkey para indice -1
  
ListView1.SortKey = ColumnHeader.Index - 1
   ListView1.SortOrder = lvwAscending
Else
  'Se a coluna ja esta selecionada entao altera a
   'propr. SetOrder para ser o oposto da coluna em uso

  ListView1.SortOrder = IIf(ListView1.SortOrder = lvwAscending, lvwDescending, lvwAscending)
End If

'Define a propriedade Sorted para utilizar a ordem atual
ListView1.Sorted = True
End Sub


Cria e exibe um Lista com dois items e subitens Realiza a ordenação dos itens conforme o usuário clicar na coluna1

 

 

 

 

 

 

 

 

 

Nota: Se Sorted=True os itens serão ordenados alfabeticamente de acordo com a propriedade SortOrder.

Aqui encerramos a primeira parte deste artigo. Veja a continuação em : Usando Listview II...