Dev (Back & Front)ARTIGO

VB .NET – o controle Listview revisitado

Eu já escrevi muitos artigos sobre
o controle ListView, desde os tempos do VB6. Ele é um dos meus
controles
favoritos, e por isso resolvi voltar ao tema para recordar e mostrar como
fazer a
manutenção de dados XML usando o ListView.

O controle ListView é uma janela
que exibe uma coleção de itens de quatro maneiras possíveis e
permite muitas formas de arranjar e exibir os itens, sendo muito
maleável e flexível. Neste artigo eu vou mostrar o ListView realizando operações como incluir, editar e
deletar itens.

Para recordar o básico sobre as
propriedades e métodos do ListView segue abaixo
um resumo.

O
controle ListView fornece um grande número de propriedades
que permite configurar sua aparência e comportamento de
uma forma muito flexível. Dentre as principais
propriedades citamos :

  1. View – permite alterar a
    forma nas quais os itens são exibidos
  2. LargeImageList , SmallImageList
    e StateImageList –
    permite especificar o objeto ImageList que
    contém as imagens
    exibidas para os itens
  3. Columns – permite o acesso a
    coleção que armazena os cabeçalhos das colunas
  4. Items – premite acessar os
    métodos para manipular os itens no controle
  5. Sorting – permite ordenar os
    itens alfabeticamente
  6. LabelEdit – permite ao usuário
    editar o texto de um item
  7. CheckedItems – permite saber quais
    itens estão marcados
  8. AllowColumnReorder – permite re-configurar
    a ordem das colunas em tempo de execução
  9. FullRowSelect – permite a seleção de
    um item e subitem

Além desta propriedades
o controle ListView também possui métodos e eventos que
podemos usar em nossas aplicações aumentando assim as
capacidades do controle ListView.  Vejamos alguns
deles :

  1. BeginUpdate

    e EndUpdate :
    permite incluir itens em um ListView sem
    redesenhar o controle a cada item que é
    adicionado

  2. GetItemAt
    – permite
    determinar o item cujos subitens esta sendo
    clicado
  3. EnsureVisible – pode ser chamado para
    assegurar que o item especifico esta na área
    visível do controle.
  4. BeferoLabelEdit

    e AfterLabelEdit – permite validar o texto
    que esta sendo editado antes e depois da
    alteração do texto

  5. ColumnClick
    – permite ativar
    uma rotina quando a coluna é clicada.
  6. ItemCheck
    – permite
    determinar quando a alteração no estado de um
    item ocorreu.

Da
teoria à prática

Vou usar o Visual Basic 2008 Express
Edition para criar o exemplo
usado neste artigo onde irei mostrar como incluir, alterar e
editar itens do ListView.

Nosso exemplo será uma lista de
contatos contendo o nome e o telefone do contato. Os dados serão
persistidos no arquivo XML chamado contatos.xml
salvo na pasta c:\dados.

Abra o VB 2008 e crie um novo
projeto do tipo Windows
Forms Application com o nome ListViewNet;

No formulário padrão form1.vb
inclua os controles : Label, Button e ListView conforme
o leiaute abaixo:

Controles usados no
formulário:

  • 2 Label – Nome e
    Telefone;
  • 2 TextBox – txtNome e
    txtTelefone ;
  • 1 ListView – lstvDados;
  • 5 Button : btnNovo,
    btnEditar, btnExcluir, Salvar dados
    e btnSair;

Definição das propriedades
do controle ListView:

  • FullRowSelect
    = True
    GridLines = True
    HideSelection = False
    MultiSelect = False
    View = Details

Em nosso projeto vamos usar o
namespace System.Xml pois pretendemos salvar e carregar os
dados
a partir de um arquivo XML. Faça a seguinte declaração no
formulário :

imports System.Xml

A seguir no formulário vamos
definir uma variável chamada blnNovo do tipo Boolean para
indicar se estamos incluindo ou editando os dados:

Dim blnNovo As Boolean

Quando o formulário for carregado
iremos exibir os dados que estão no arquivo XML no ListView para
isso declare a chamada a rotina preencheLista()
no evento Load do formulário:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As <br />System.EventArgs) Handles MyBase.Load<br />        preencheLista()<br /><br />End Sub

A seguir defina a rotina
preencheLista() abaixo:

Private Sub preencheLista()<br /><br />'//////////////////////////////////////////<br />        '<?xml <br />version="1.0" encoding="us-ascii"?><br />        '<Agenda><br /><br />     ' <contato><br />        '   <nome>Macoratti</nome><br /><br />        '   <telefone>123167999</telefone><br />        '  <br /></contato><br />        '</Agenda><br /><br />'/////////////////////////////////////////<br /><br />lstvDados.Columns.Add("Nome", 100, HorizontalAlignment.Left)<br /><br />lstvDados.Columns.Add("Telefone", 100, HorizontalAlignment.Left)<br /><br /><br />        Dim doc As New XmlDocument<br />        Try<br /><br />doc.Load("c:\dados\contatos.xml")<br />        Catch ex As Exception<br /><br />          MsgBox("Erro ao ler arquivo XML.")<br />            Exit Sub<br /><br />        End Try<br />        Dim nodes As XmlNodeList = <br />doc.SelectNodes("Agenda/contato")<br /><br />        For Each element As <br />XmlElement In nodes<br />            Dim telefone As String = <br />element.SelectSingleNode("telefone").InnerText<br />            Dim nome <br />As String = element.SelectSingleNode("nome").InnerText<br /><br />lstvDados.Items.Add(New ListViewItem(New String() {nome, telefone}))<br /><br />        Next<br />    End Sub

Neste código definimos as colunas
do ListView que serão o cabeçalho exibindo o Nome e
Telefone. A
seguir carregamos o arquivo XML contatos.xml e exibimos o seu
conteúdo no ListView.

Para incluir um novo contato
incluímos o código a seguir no evento Click do botão de comando
Novo:

Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As <br />System.EventArgs) Handles btnNovo.Click<br />        If <br />btnNovo.Text.ToLower() = "novo" Then<br />            txtNome.Enabled = <br />True<br />            txtTelefone.Enabled = True<br /><br />btnNovo.Text = "Salvar"<br />            btnEditar.Text = "Cancelar"<br /><br />          btnDeletar.Enabled = False<br />            txtNome.Text = ""<br /><br />            txtTelefone.Text = ""<br />            blnNovo = True<br /><br />   Else<br />            txtNome.Enabled = False<br /><br />txtTelefone.Enabled = False<br />            btnNovo.Text = "Novo"<br /><br />        btnEditar.Text = "Editar"<br />            btnDeletar.Enabled = <br />True<br />            If blnNovo Then<br />                If txtNome.Text =<br /> String.Empty Then<br />                    MsgBox("Informe o nome.")<br /><br />                   Return<br />                End If<br /><br />If txtTelefone.Text = String.Empty Then<br /><br />MsgBox("Informe o telefone.")<br />                    Return<br /><br />       End If<br /><strong>                <br />IncluirItensNoListView(lstvDados, txtNome.Text, txtTelefone.Text)<br /></strong><br />            Else<br /><strong>                EditarItensNoListView()<br /></strong><br />            End If<br />        End If<br />    End Sub

Este código habilta/desabilita os
botões apropriados a tarefa a ser realizada e conforme a opção
selecionda usa as rotinas para incluir ou editar dados:

  • A rotina incluirItensNoListView()
    passa como parâmetro o controle ListView e os valores que vamos
    incluir, no caso, nome e telefone informados nas caixas de texto
    do formulário;
  • A rotina EditarItensNoListView()
    apenas a chama rotina para efetuar a edição das informações;

A rotina incluirItensNoListView()
é
a seguinte:

 Private Sub IncluirItensNoListView(ByVal lv As ListView, ByVal item<br /> As String, ByVal ParamArray subitem As String())<br /><br />''Geralmente a primeira coluna é o item raiz<br />        ''As colunas <br />restantes são sub-itens<br />        ' cria o item.<br />        Dim <br />novo_item As ListViewItem = lstvDados.Items.Add(txtNome.Text)<br /><br /> ' cria os sub-items.<br />        For i As Integer = <br />subitem.GetLowerBound(0) To subitem.GetUpperBound(0)<br /><br />novo_item.SubItems.Add(subitem(i))<br />        Next i<br />    End Sub 

nela estamos criando o item e o
subitem informados para serem gravados.

A rotina EditarItensNoListView()
mostrada a seguir verifica se existe um item selecionado no
ListView e efetua a edição.

Private Sub EditarItensNoListView()<br />        'verifica se existem <br />um item selecionado para alterar<br />        If <br />lstvDados.SelectedItems.Count > 0 Then<br /><br />lstvDados.SelectedItems(0).Text = txtNome.Text<br /><br />lstvDados.SelectedItems(0).SubItems(1).Text = txtTelefone.Text<br /><br />  End If<br />    End Sub

O código para editar dados no
ListView do evento Click do botão Editar apenas verifica se

 Private Sub btnEditar_Click(ByVal sender As System.Object, ByVal e <br />As System.EventArgs) Handles btnEditar.Click<br />        If <br />txtNome.Text.Length > 0 Then<br />            If <br />btnEditar.Text.ToLower() = "editar" Then <br /><br />txtNome.Enabled = True<br />                txtTelefone.Enabled = True<br /><br />                btnNovo.Text = "Salvar"<br /><br />btnEditar.Text = "Cancelar"<br />                btnDeletar.Enabled = <br />False<br />                blnNovo = False<br />            Else 'cancela<br /><br />                txtNome.Enabled = False<br /><br />txtTelefone.Enabled = False<br />                btnNovo.Text = "Novo"<br /><br />                btnEditar.Text = "Editar"<br /><br />btnDeletar.Enabled = True<br />            End If<br />        Else<br /><br />       MessageBox.Show("Selecone um item para editar...")<br />        End<br /> If<br /><br />    End Sub

Para excluir um item usamos o
código a seguir no evento Click do botão Excluir e usa o
método Remove do controle ListView para remover o item:

Private Sub btnDeletar_Click(ByVal sender As System.Object, ByVal e <br />As System.EventArgs) Handles btnDeletar.Click<br />        'verifica se <br />existe um item selecionado para exclusão<br />        If <br />lstvDados.SelectedItems.Count > 0 AndAlso MessageBox.Show("Deseja <br />deletar este item ?", "Confirma", MessageBoxButtons.YesNo) = _ <br />Windows.Forms.DialogResult.Yes<br /> Then<br />            lstvDados.SelectedItems(0).Remove()<br />        End <br />If<br />    End Sub

Para salvar os dados do controle
ListView no arquivo XML contatos.xml usamos o código
abaixo:

Private Sub btnSalvarDadosXML_Click(ByVal sender As System.Object, <br />ByVal e As System.EventArgs) Handles btnSalvarDadosXML.Click<br /><br /><br />    Dim x As New Xml.XmlTextWrite<strong>r("C:\dados\contatos.xml", <br />System.Text.Encoding.ASCII)</strong><br /><br />        Dim i As Integer<br /><br />        x.WriteStartDocument()<br />        x.WriteStartElement("Agenda")<br /><br />        i = lstvDados.Items.Count<br />        For Each lvi As <br />ListViewItem In lstvDados.Items<br /><br />x.WriteStartElement("contato")<br /><br />x.WriteElementString("nome", lvi.Text)<br /><br />x.WriteElementString("telefone", lvi.SubItems(1).Text)<br /><br />x.WriteEndElement()<br />        Next<br />        x.WriteEndDocument()<br /><br />       x.Close()<br /><br />    End Sub

No botão Buscar
temos o código abaixo onde chamamos a rotina procuraritem():

Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e<br /> As System.EventArgs) Handles btnProcurar.Click<br />        If Not <br />txtNome.Text = String.Empty Then<br />            procurarItem()<br /><br />  End If<br />    End Sub

A rotina procurarItem() usa o
método FindItemWithText para localizar um item
no controle e em caso positivo marca o item e o seleciona
destacando dos demais:

O método FindItemWithText(String)

Localiza o primeiro ListViewItem que
começa com o valor de texto especificado.

O parâmetro

String 
pode especificar uma Sub-cadeia do texto correspondente desejado. Além
disso,
esse método retornará o primeiro item que começa com o texto
especificado.


O método de FindItemWithText retorna
uma
referência nula (Nothing no Visual Basic) se a lista estiver
Vazio ou não
há nenhum item correspondente.

Private Sub procurarItem()<br />        Dim <br />lvItem As ListViewItem<br /> = lstvDados.FindItemWithText(txtNome.Text, False,<br /> 0, True)<br /><br />   If (lvItem IsNot Nothing) Then<br /><br />lvItem.Checked = <br />True<br />            lvItem.Selected = True<br /><br /><br />lvItem.ForeColor = Color.Blue<br />        End If<br />    End Sub

Obs: A rotina para
procurar um item
precisa ser melhor ajustada no projeto. Deixo isso como um
exercício.

A seguir temos a figura do resultado
da execução do projeto onde incluímos e editamos alguns itens.
Ao lado temos o respectivo XML gerado:

<?xml version="1.0" encoding="us-ascii"?><br /><Agenda><br /><br />  <contato><br />    <nome>Macoratti</nome><br /><br /><telefone>111111</telefone><br />  </contato><br /><br /><contato><br />    <nome>teste</nome><br /><br /><telefone>1111</telefone><br />  </contato><br /><br /><contato><br />    <nome>maria</nome><br /><br /><telefone>888877777</telefone><br />  </contato><br /><br /><contato><br />    <nome>Janeiro</nome><br /><br /><telefone>999999988888888</telefone><br />  </contato><br /><br />  <contato><br />    <nome>paulo</nome><br /><br /><telefone>098098</telefone><br />  </contato><br /><br /><contato><br />    <nome>carlos</nome><br /><br /><telefone>4444444</telefone><br />  </contato><br /></Agenda>

Dessa forma criamos um pequeno
projeto capaz de efetuar as informações em um controle ListView
persistindo os dados em um arquivo XML.

Pegue o projeto completo aqui:
 ListViewNet.zip

Eu sei é apenas VB .NET mas eu
gosto…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil