VB .NET - Preenchendo um ListView a partir de um arquivo texto


O controle ListView do VB .NET é muito usado em aplicações Windows Forms para exibir dados e pode ter como fonte de dados uma variedade de origens como: banco de dados, arquivos xml, arquivos textos, etc.

Neste artigo eu mostro como podemos ler um arquivo texto delimitado e exibir o seu conteúdo em um controle ListView em uma aplicação Windows Forms, além disso vamos criar uma opção para que o conteúdo do ListView seja salvo se ocorrer alguma alteração.

Abaixo temos um arquivo texto que contém o nome , o email, a idade e o estado de origem de pessoas que foram aprovadas em um exame. Nosso objetivo é ler o arquivo texto e exibir os dados no controle ListView:

Ao lado temos o arquivo texto  aberto no bloco de notas que iremos exibir no ListView.

As informações entre as colunas estão delimitadas por um caractere de tabulação TAB que foi produzido no momento de gerar o arquivo.

Para os exemplos mostrados neste artigo eu estou  usando o Visual Basic 2010 Express Edition.

Abra o Visual Basic 2010 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome preencheListView;

Insira no formulário padrão form1.vb os seguintes controles:

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

O leiaute do formulário deverá ser conforme exibe a figura abaixo:

Como vamos usar os recursos das classes StreamReader, FileStream e StreamWriter precisamos declarar o namespace : System.IO no formulário.

No evento Load do formulário vamos criar as colunas no controle ListView definindo o nome a largura de cada uma delas:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lvDados.View = View.Details
        'colunas criadas com nome da coluna e largura 
        lvDados.Columns.Add("Nome", 100)
        lvDados.Columns.Add("Email", 140)
        lvDados.Columns.Add("Idade", 50)
        lvDados.Columns.Add("Estado", 50)
    End Sub

 

Na caixa de texto txtArquivoOrigem devemos informar o caminho e o nome do arquivo texto que vamos ler e a partir do qual vamos preencher o ListView.

Para fazer isso vamos usar os recursos do controle OpenFileDialog. No evento Click do botão btnProcurarArquivo inclua o código a seguir:

Private Sub btnProcurarArquivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurarArquivo.Click

        Dim AbrirComo As OpenFileDialog = New OpenFileDialog()
        Dim caminho As DialogResult
        Dim Arquivo As String
        AbrirComo.Title = "Abrir como"
        AbrirComo.FileName = "Nome Arquivo"
        AbrirComo.Filter = "Arquivos Textos (*.txt)|*.txt"
        caminho = AbrirComo.ShowDialog
        Arquivo = AbrirComo.FileName

        If Arquivo = Nothing Then
            MessageBox.Show("Arquivo Invalido", "Abrir", MessageBoxButtons.OK)
        Else
            txtArquivoOrigem.Text = Arquivo
        End If
    End Sub

 

Este código usa o componente OpenFIleDialog para abrir a janela de diálogo Abrir arquivo onde podemos selecionar um arquivo texto para leitura sendo que o caminho e nome do arquivo é atribuído e exibido a caixa de texto.

Para transferir os dados do arquivo texto para o ListView podemos seguir as seguintes etapas;

No evento Click do botão btnPreencheListView inclua o código abaixo:

 Private Sub btnPreencheListView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreencheListView.Click
        'verifica se o caminho e nome do arquivo estão ok
        If txtArquivoOrigem.Text = String.Empty Or Not txtArquivoOrigem.Text.Contains(".txt") Then
            MsgBox("Informe o caminho do arquivo texto origem.")
            Return
        End If

        Try
            'declara um streamReader e passa o caminho e nome do arquivo texto
            Dim SR As New StreamReader(txtArquivoOrigem.Text)

            ' variavel que trata as linhas que são lidas
            Dim strTemp() As String

            Do While SR.Peek <> -1 ' Utilize Peek para ler o arquivo até que não haja mais linhas

                ' cria uma variavel para o ListViewItems
                Dim LVItem As New ListViewItem

                ' Le a proxima linha no arquivo e a separa se estiver usando TAB
                strTemp = SR.ReadLine.Split(Chr(9))
                ' Extrai o primeiro elemento na linha e atribui os dados a primeira coluna
                LVItem.Text = strTemp(0).ToString
                '  Inclui o item no ListView
                lvDados.Items.Add(LVItem)
                '  Atribui as demais linhas ao subitens
                LVItem.SubItems.Add(strTemp(1).ToString)
                LVItem.SubItems.Add(strTemp(2).ToString)
                LVItem.SubItems.Add(strTemp(3).ToString)
            Loop
            SR.Close() ' fecha o StreamReader 
        Catch ex As Exception
            MsgBox("Erro ao ler o arquivo texto." & ex.Message)
        End Try
    End Sub

Executando o projeto e selecionando o arquivo RelacaoAprovados.txt na pasta c:\dados iremos obter:

Agora só falta a rotina para salvar o conteúdo do ListView no arquivo texto. Para fazer isso podemos seguir as seguintes etapas:

O código que implementa esse 'algoritmo'  deve ser colocado no evento Click do botão Salvar e esta descrito a seguir:

 Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click

        'verifica se o caminho e nome do arquivo estão ok
        If txtArquivoOrigem.Text = String.Empty Or Not txtArquivoOrigem.Text.Contains(".txt") Then
            MsgBox("Informe o caminho do arquivo texto origem.")
            Return
        End If

        ' Cria um FileStream e um StreamWriter para acessar e escrever no arquivo texto
        Dim FS As New FileStream(txtArquivoOrigem.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
        Dim SW As New StreamWriter(FS)

        Try
            If lvDados.Items.Count <= 0 Then Throw New Exception
            ' percorre todas as linhas
            For Index As Integer = 0 To lvDados.Items.Count - 1
                '  percorre todas as colunhas coletando os itens e escreve no arquivo incluindo o TAB
                For SubIndex As Integer = 0 To lvDados.Items(Index).SubItems.Count - 1
                    SW.Write(lvDados.Items(Index).SubItems(SubIndex).Text & Chr(9))
                Next
                ' cria uma nova linha 
                SW.Write(Environment.NewLine)
            Next
            MsgBox("Arquivo salvo com sucesso.")
        Catch ex As Exception
            MsgBox("Erro ao salvar dados no arquivo texto." & ex.Message)
        Finally
            SW.Close()
            FS.Close()
        End Try
    End Sub

 

Como exercício você pode incrementar o exemplo tornando-o genérico para ler qualquer arquivo texto delimitado.

Simples, simples assim...

Pegue o projeto completo aqui:   preencherListView.zip

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

Referências:

José Carlos Macoratti