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: