VB.NET - Usando o controle ListView


O controle ListView exibe uma lista de itens com ícones e subitens opcionais associados. O controle contém uma coleção de objetos do tipo ListViewItem ; a propriedade Items. Esta propriedade é do tipo ListViewIemCollection,  que possui métodos para incluir , remover e manipular itens em uma coleção.

A classe ListViewItemCollection implementa a interface ICollection ,  a interface IList que deriva dela , e a interface IEnumerable. As duas primeiras interfaces fornecem acesso a items individuais baseado em um índice ; já  a interface IEnumerable fornece a capacidade de iteração sobre a coleção. Estas características são as principais de um controle ListView.

O controle ListView possui 3 maneiras de visualização especificada pela propriedade View : large icon, small icon , list e detail.  Quando a propriedade View é definida para SmallIcon ou List a imagem exibida com cada item é obtida da lista de imagens definida pela propriedade SmallImageList. Quando a propriedade View é definida para LargeIcon as imagens são obtidas da lista de imagens definidas pela propriedade LargeImageList.

Imagens pequenas são exibidas em 16x16 pixels , enquanto que imagens grandes são exibidas em um quadro de 32 até 64 pixels. Em todas as 3 formas de visualização , a única informação exibida com cada item, é a propriedade Text.

Quando a propriedade View é definida como Details, o ListView exibe colunas contendo subitens. Um ou mais itens em um ListView pode ser selecionado. Se a propriedade é definida como True então múltiplos itens podem ser selecionados .

Os itens selecionados podem ser acessados através das propriedades SelectedItems e SelectedIndices. A propriedade SelectedItems cont[em uma coleção de somente leitura dos itens selecionados e a propriedade SelectedIndices contém uma coleção somente leitura de indices dos itens selecionados.

Quando um item selecionado em um ListView muda, ou quando um item é selecionado e depois desmarcado em uma seleção múltipla então o evento SelectedIndexChanged é disparado. Você pode então processar as coleções em SelectedItems ou SelectedIndices.

Você deve se precaver do fato que o evento SelectedIndexChanged pode ser disparado duas vezes quando um item for selecionado : uma quando o primeiro item é desmarcado e novamente quando um a nova seleção é feita. para evitar o tratamento de eventos em duplicidade teste a propriedade SelectedIndices.Count no interior do tratamento do evento e faça o processamento desejado somente quando a contagem não for igual a zero. Veja o código de exemplo a seguir:

Private Sub listView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
   If Not (listView1.SelectedIndices.Count = 0) Then
       'efetue a operação desejada
   End If
End Sub

Para incluir um item em um controle ListView basta especificar o item e atribuindo propriedades a ele.

Fazer isto em tempo de desenho é muito simples , basta selecionar o controle ListView que você inseriu no formulário de um projeto Windows que você criou e na janela de propriedades do controle , clique no botão na propriedade Items. A janela - ListViewItem Collection Editor será aberta e você poderá incluir itens usando a interface exibida na janela.

 

Ao criar um ListItem no VB.NET você deve explicitamente criar o ListItem e então incluí-lo a coleção de Items do ListView.

O exemplo a seguir criar um ListItem em um controle ListView chamado lvwClientes que foi incluído no formulário:

Dim lista AS ListItem = New ListViewItem()

lsita.Text = "Primeira Coluna"
lvwClientes.Items.Add(lista)

lista = Nothing


Para trabalhar subitens em um componente ListView no VB.NET você precisa incluir Subitens na coleção de subitens dos itens do controle, antes de anexar a lista de itens a coleção Items.

Abaixo temos um exemplo de código onde criamos um ListItem com subitens para um ListView chamado lvwClientes que foi inserido no formulário:

Dim lista AS ListItem = New ListViewItem()

lista.Text = "Primeira coluna"
lista.SubItems.Add("Segunda coluna")
lista.SubItems.Add("Terceira coluna")
lista.SubItems.Add("Quarta coluna")
lvwClientes.Items.Add(lista)

lista = Nothing

Para remover um item usamos o método RemoveAt ou Clear da propriedade Items.

RemoveAt - remove um único item : ListView1.Items.RemoveAt(0)

Clear - Remove todos os itens da lista : ListView1.Items.Clear()


Vamos ver agora como podemos preencher um controle ListView com as informações de um banco de dados.

Inicie um novo projeto no Visual Studio do tipo Windows Application usando a linguagem VB.NET e o no formulário principal inclua um controle ListView e um botão de comando.

No evento Click do botão - Lista Clientes - insira o código abaixo; nele estou invocando a rotina listaClientes().

Private Sub btnListaClientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListaClientes.Click

Call listaClientes()

End Sub

A rotina listaClientes() é exibida a seguir. Nela destacamos o seguinte :

  Private Sub listaClientes()
        Dim conexaoSQLServer As SqlConnection
        Dim sqlCmd As SqlCommand = New SqlCommand("SELECT CustomerID,ContactName,Address,City,Country FROM Customers")
        Dim dr As SqlDataReader
        Dim itmListItem As ListViewItem
        Dim lvClientes As ListViewData = New ListViewData
        conexaoSQLServer = New SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind")

        Try
            conexaoSQLServer.Open()
            sqlCmd.Connection = conexaoSQLServer
            dr = sqlCmd.ExecuteReader
            lvClientes.carregaLista(lvwClientes, dr)
            conexaoSQLServer.Close()
        Catch ex As SqlException
            MessageBox.Show(ex.ToString)
        End Try
    End Sub

A classe ListViewDados é criada através da inclusão de um módulo de classe no Menu Project. Nela temos o método carregaLista que recebe como parâmetro um objeto ListView e um objeto do tipo DataReader.

Imports System.Data.SqlClient

Public Class ListViewDados
    Public Sub carregaLista(ByRef mListView As ListView, ByRef mDados As SqlDataReader)

        Dim lvwColuna As ColumnHeader
        Dim itmListItem As ListViewItem
        Dim strTeste As String
        Dim cnt As Short

        mListView.Clear()
       'atribui os nomes das colunas 
       For cnt = 0 To mDados.FieldCount() - 1
            lvwColuna = New ColumnHeader
            lvwColuna.Text = mDados.GetName(cnt)
            mListView.Columns.Add(lvwColuna)
        Next

        'percorre os dados do datareader e preenche o listview
        Do While mDados.Read
            itmListItem = New ListViewItem
            strTeste = IIf(mDados.IsDBNull(0), "", mDados.GetString(0))
            itmListItem.Text = strTeste

            For cnt = 1 To mDados.FieldCount() - 1
                If mDados.IsDBNull(cnt) Then
                    itmListItem.SubItems.Add("")
                Else
                    itmListItem.SubItems.Add(mDados.GetString(cnt))
                End If
           Next cnt
           mListView.Items.Add(itmListItem)
        Loop
    End Sub
End Class

Executando o projeto temos o resultado exibido na figura abaixo:

 

Eu sei é apenas VB.NET , mas eu gosto ...


José Carlos Macoratti