Ir para o conteúdo

ListViews e 36 utilidades directas

Introdução

As ListView são poderosos componentes de apresentação que devidamente aproveitados ostentam potencial para ir de encontro às necessidades práticas e estéticas de cada aplicação. É um componente bastante completo, bastante flexível e surpreendentemente fácil de trabalhar.

Como na matemática, o melhor método para a aprendizagem chama-se prática, e a melhor maneira de praticar é cobrir todas as funcionalidades básicas em forma de exemplos que se possam aplicar instantaneamente.

As ListView possuem uma propriedade de nome View, que nos indica o tipo de vista com que estamos a trabalhar. Estas vistas são:

Vista Descrição
LargeIcon Ou ícones grandes. Apresenta os items acompanhados de imagens.
SmallIcon Ou ícones pequenos. Apresenta os items acompanhados de pequenas imagens.
Details Lista de items com detalhes, ou sub-items. Semelhante a uma grelha.
List Ou lista. Apresenta os items como uma lista comum.
Tile Ou em mosaico. Semelhante a LargeIcon.

Com isto, e deduzindo que se tenham algumas bases em relação à sintaxe do Visual Basic 2008, listam-se abaixo 36 utilidades que se podem aplicar directamente a uma ListView ou aos items de uma ListView.

Importante: Todas as utilidades são aplicadas a uma listview de nome "LV" e algumas das utilidades necessitam de pré-requisitos ou não são compatíveis com todos os modos de vista da ListView. Estas indicações são fornecidas.

1 - Adicionar colunas

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        Dim C1 As New ColumnHeader
        Dim C2 As New ColumnHeader
        Dim C3 As New ColumnHeader

        C1.Name = "Nome"
        C1.Text = "Nome"

        C2.Name = "Idd"
        C2.Text = "Idade"

        C3.Name = "Mrd"
        C3.Text = "Morada"

        LV.Columns.Add(C1)
        LV.Columns.Add(C2)
        LV.Columns.Add(C3)

2 - Remover colunas

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1

        LV.Columns.RemoveByKey("Mrd")

Nota: Também é possível remover com referência (Remove) ou por índice (RemoveAt)

3 - Alterar colunas

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1

        LV.Columns("Nome").Text = "Noooome"

Nota: Também é possível alterar a largura da coluna (Width).

Nota: Também é possível alterar com referência ou por índice.

4 - Adicionar itens

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        Dim LVI As New ListViewItem
        Dim SLVI1 As New ListViewItem.ListViewSubItem
        Dim SLVI2 As New ListViewItem.ListViewSubItem
        LVI.Name = "Nome"
        LVI.Text = "João"

        SLVI1.Name = "Idade"
        SLVI1.Text = "20"

        SLVI2.Name = "Morada"
        SLVI2.Text = "Rua da Pantera"

        LVI.SubItems.Add(SLVI1)
        LVI.SubItems.Add(SLVI2)

        LV.Items.Add(LVI)

Ideia: Pode-se e deve-se usar a propriedade Tag, por item, para armazenar qualquer informação adicional importante.

Importante: Também é possível adicionar sem chave (LV.Items.Add) mas perde-se bastante capacidade de futura referência, degradando a facilidade de manutenção.

Aviso: SubItems são apenas compatíveis com a vista Details.

Aviso: Na vista Details, se não existirem colunas os itens não aparecem.

5 - Referenciar o valor de uma coluna, num item seleccionado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1,#4, 1 item seleccionado

        MsgBox(LV.SelectedItems(0).SubItems("Idade").Text)

Nota: Também é possível referenciar com índice.

6 - Referenciar o valor de uma coluna, em todos os itens seleccionados

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1,#4,#26, Seleccionar itens

        For Each Item As ListViewItem In LV.SelectedItems
            MsgBox(Item.SubItems("Idade").Text)
        Next

7 - Referenciar o valor de uma coluna, em todos os itens da lista

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1,#4

        For Each I As ListViewItem In LV.Items
            MsgBox(I.SubItems("Idade").Text)
        Next

8 - Remover todos os itens

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        LV.Items.Clear()

9 - Remover todos os itens e colunas

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #1,#4

        LV.Clear()

10 - Remover o item seleccionado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4, 1 item seleccionado

        LV.SelectedItems(0).Remove()

11 - Remover itens por chave

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        LV.Items.RemoveByKey("Nome")

12 - Remover itens por índice

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        LV.Items(0).Remove()

13 - Remover todos os itens seleccionados

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4,#26, Seleccionar itens

        For Each LVI As ListViewItem In LV.SelectedItems
            LVI.Remove()
        Next

14 - Colorir todos os itens

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        For Each LVI As ListViewItem In LV.Items
            LVI.UseItemStyleForSubItems = True
            LVI.BackColor = Color.Bisque
            LVI.ForeColor = Color.Red
        Next

Nota: BackColor altera a cor de fundo e ForeColor altera a cor da fonte.

Nota: Também é possível efectuar colorização através de referência ou índice.

15 - Colorir itens pares

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        For i As Integer = 0 To LV.Items.Count Step 2
            If i >= LV.Items.Count Then Exit For
            LV.Items(i).UseItemStyleForSubItems = True
            LV.Items(i).BackColor = Color.BlueViolet
            LV.Items(i).ForeColor = Color.White
        Next

Nota: BackColor altera a cor de fundo e ForeColor altera a cor da fonte.

16 - Colorir itens ímpares

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        For i As Integer = 1 To LV.Items.Count Step 2
            If i >= LV.Items.Count Then Exit For
            LV.Items(i).UseItemStyleForSubItems = True
            LV.Items(i).BackColor = Color.BlueViolet
            LV.Items(i).ForeColor = Color.White
        Next

Nota: BackColor altera a cor de fundo e ForeColor altera a cor da fonte.

17 - Atribuír um ícone a um item seleccionado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4, 1 item seleccionado

        Dim IL As New ImageList
        Dim B As Bitmap = New Bitmap(Me.Icon.ToBitmap)
        IL.Images.Add("Icone1", B)

        LV.SmallImageList = IL

        LV.SelectedItems(0).ImageKey = "Icone1"

Importante: Para a vista LargeIcon, a propriedade é LV.LargeImageList e não SmallImageList.

Nota: É aceite qualquer tipo de imagem suportada.

18 - Atribuír imagens de estado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        Dim IL As New ImageList
        Dim B As Bitmap = New Bitmap(Me.Icon.ToBitmap)
        Dim B2 As Bitmap = New Bitmap(16, 16)
        Dim g As Graphics = Graphics.FromImage(B2)
        g.Clear(Color.Red)

        IL.Images.Add("Icone1", B)
        IL.Images.Add("Icone2", B2)

        LV.CheckBoxes = True
        LV.StateImageList = IL

Nota: É aceite qualquer tipo de imagem suportada por uma ImageList.

19 - Adicionar CheckBoxes a cada item

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        LV.StateImageList = Nothing
        LV.CheckBoxes = True

20 - Verificar estado da CheckBox de um item seleccionado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4,#18 ou #19, 1 item seleccionado

        MsgBox(LV.SelectedItems(0).Checked.ToString)

Nota: Também é possível efectuar esta verificação através de referência ou índice.

21 - Ordenar itens alfabéticamente

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        If LV.Sorting = SortOrder.Descending Then
            LV.Sorting = SortOrder.Ascending
        Else
            LV.Sorting = SortOrder.Descending
        End If
        LV.Sort()

22 - Adicionar grupos

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.ShowGroups = True

        Dim GA As New ListViewGroup
        GA.Header = "Grupo A"
        GA.HeaderAlignment = HorizontalAlignment.Center
        GA.Name = "A"

        Dim GB As New ListViewGroup
        GB.Header = "Grupo B"
        GB.HeaderAlignment = HorizontalAlignment.Center
        GB.Name = "B"

        LV.Groups.Add(GA)
        LV.Groups.Add(GB)

Importante: A vista List não apresenta grupos, mas suporta-os internamente.

23 - Atribuír o item seleccionado a um grupo

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4,#22, 1 item seleccionado

        LV.SelectedItems(0).Group = LV.Groups("A")

Nota: Também é possível efectuar atribuições através de referência ou índice.

24 - Distribuír todos os itens por grupos

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4,#22

        Dim Grupo As String = "A"
        For Each LVI As ListViewItem In LV.Items
            LVI.Group = LV.Groups(Grupo)
            If Grupo = "A" Then
                Grupo = "B"
            Else
                Grupo = "A"
            End If
        Next

25 - Desassociar o item seleccionado de um grupo

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4,#22,#23, 1 item seleccionado

        LV.SelectedItems(0).Group = Nothing

Nota: Também é possível efectuar desassociações através de referência ou índice.

26 - Permitir multiselecção de itens

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.MultiSelect = True

27 - Possibilitar a selecção de uma linha inteira

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.FullRowSelect = True

28 - Permitir edição de um item na lista

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.LabelEdit = True

29 - Activar linhas de grelha

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.GridLines = True

Aviso: Se existirem grupos e estiverem visíveis, as linhas de grelha não aparecem.

30 - Evitar perda de selecção na perda de foco

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.HideSelection = False

31 - Seleccionar itens com passagem do rato

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.HoverSelection = True

32 - Apresentar grupos

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.ShowGroups = True

33 - Definir o tamanho dos tiles

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: Nenhuns

        LV.TileSize = New Drawing.Size(100, 100)

34 - Adicionar uma ToolTip no item seleccionado

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4, 1 item seleccionado

        LV.ShowItemToolTips = True
        LV.SelectedItems(0).ToolTipText = "A vida é bela"

Nota: Também é possível aplicar ToolTips através de referência ou índice.

35 - Subir um item

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        Dim NewIndex As Integer = LV.SelectedItems(0).Index - 1
        If NewIndex < 0 Then Exit Sub

        Dim TempLVI As ListViewItem = LV.SelectedItems(0)
        Dim LVI As New ListViewItem
        LVI.Name = TempLVI.Name
        LVI.Text = TempLVI.Text
        LV.Items.Insert(NewIndex, LVI)
        TempLVI.Remove()
        LV.Items(NewIndex).Selected = True

Aviso: Este método genérico serve apenas para demonstrar o conceito e não move SubItens de Itens.

36 - Descer um item

Compatibilidade: LargeIcon | SmallIcon | Details | List | Tile
Pré-requisitos: #4

        Dim NewIndex As Integer = LV.SelectedItems(0).Index + 1
        If NewIndex > LV.Items.Count - 1 Then Exit Sub

        Dim TempLVI As ListViewItem = LV.SelectedItems(0)
        Dim LVI As New ListViewItem
        LVI.Name = TempLVI.Name
        LVI.Text = TempLVI.Text
        LV.Items.Insert(NewIndex + 1, LVI)
        TempLVI.Remove()
        LV.Items(NewIndex).Selected = True

Aviso: Este método genérico serve apenas para demonstrar o conceito e não move SubItens de Itens.

Conclusão

Com a análise e conjugação destas 36 utilidades, mesmo que algumas sejam apenas afectação de uma propriedade, consegue-se atingir a maioria dos aspectos mais utilizados em aplicações existentes. Existe um sem fim de configuração, personalização e atalhos que só a experiência consegue trazer. As 36 utilidades são genéricas e podem ser facilmente alteradas. São portanto uma boa base para o domínio das ListView.