C#
- Manutenção de dados com ListView sem base de dados
![]() |
Neste artigo vou mostrar como efetuar a manutenção de dados realizando operações de inclusão , exclusão e atualização de dados. |
Eu estou usando o SharpDevelop 2.2 mas podemos usar o Visual C# Express Edition.
Inicie o SharpDevelop e no menu Arquivo selecione Novo -> Solução;
A seguir na janela Novo Projeto selecione C# -> Aplicações Windows e informe o nome ListViewManu e clique em Criar;
![]() |
No formulário MainForm.cs inclua os componentes conforme o leiaute abaixo;
![]() |
Controles
e suas propriedades usadas no formulário -
MainForm.cs
|
Os namespaces que iremos usar no projeto são:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
A primeira tarefa que vamos definir é a inicialização do controle ListView. Vamos definir os nomes dos cabeçalhos do controle incluindo na classe MainForm.cs a chamada para a rotina inicializaListView();
public
MainForm() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); InicializaListView(); } |
A rotina InicializaListView() define 3 cabeçalhos atribuindo-lhes os nomes : Nome, E-mail e Telefone , definindo , o tamanho da coluna e o alinhamento;
public
void InicializaListView() { ColumnHeader header1 = this.lstvDados.Columns.Add("Nome", 20*Convert.ToInt32(lstvDados.Font.SizeInPoints), HorizontalAlignment.Center); ColumnHeader header2 = this.lstvDados.Columns.Add("E-mail", 20*Convert.ToInt32(lstvDados.Font.SizeInPoints), HorizontalAlignment.Center); ColumnHeader header3 = this.lstvDados.Columns.Add("Telefone", 10*Convert.ToInt32(lstvDados.Font.SizeInPoints), HorizontalAlignment.Center ); } |
Para incluir os dados digitados nas caixas de texto no controle ListView definimos o código abaixo no evento Click do botão Incluir:
void
BtnIncluirClick(object sender, EventArgs e) { // cria os subitens para incluir na lista string[] mItems = new string[] { txtNome.Text, txtEmail.Text, txtFone.Text }; ListViewItem lvi = new ListViewItem(mItems); // inclui todos os itens no listview na ultima linha disponivel lstvDados.Items.Add(lvi); } |
Para salvar as informações vamos usar um Stream através da classe StreamWriter gerando um arquivo com os dados do listview onde os itens e seus subitens são gravados no arquivo;
void
BtnSalvarClick(object sender, System.EventArgs e) { try { sfd.Title = "C# - Salvar" ; sfd.InitialDirectory = @"c:\" ; sfd.Filter = "Todos (*.*)|*.*|Todos (*.*)|*.*" ; sfd.FilterIndex = 2 ; sfd.RestoreDirectory = true ; if (sfd.ShowDialog() ==System.Windows.Forms.DialogResult.OK) { //define um objeto do tipo FileStream FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write); //cria um stream de dados para salvar as informações StreamWriter m_streamWriter = new StreamWriter(fs); m_streamWriter.Flush(); // Escreve para o arquivo usando a classe StreamWriter m_streamWriter.BaseStream.Seek(0, SeekOrigin.Begin);
//percorre o ListView gravando items e subitems |
No evento Click do botão de comando Executar temos o código que acessa o banco de dados Northwind.mdb informado, executa um comando com a instrução SQL informada e gera um datareader exibido o resultado no ListView; (Veja o comentário no código para detalhes)
void BtnAbrirClick(object sender, EventArgs e) { try { OpenFileDialog fdlg = new OpenFileDialog(); fdlg.Title = "C# - Abrir " ; fdlg.InitialDirectory = @"c:\" ; fdlg.Filter = "Todos (*.*)|*.*|Todos (*.*)|*.*" ; fdlg.FilterIndex = 2 ; fdlg.RestoreDirectory = true ; if(fdlg.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(fdlg.FileName , FileMode.Open, FileAccess.Read); StreamReader m_streamReader = new StreamReader(fs); // le o arquivo usando a classe StreamWriter m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin); string strLine = m_streamReader.ReadLine(); int nStart = 0; //percorre o ListView obtendo os items e subitems while (strLine != null) { int nPos1 = strLine.IndexOf("\t",nStart); string str1 = strLine.Substring(0, nPos1); nStart = nPos1 + 1; int nPos2 = strLine.IndexOf("\t",nStart); string str2 = strLine.Substring(nStart, nPos2 - nStart); nStart = nPos2 + 1; string str3 = strLine.Substring(nStart); ListViewItem lvi = new ListViewItem(new string[]{str1, str2, str3}); lstvDados.Items.Add(lvi); nStart = 0; strLine = m_streamReader.ReadLine(); } m_streamReader.Close(); } } catch(Exception em) { MessageBox.Show(em.Message.ToString()); } } |
O
controle OpenFileDialog irá abrir a janela de diálogo Abrir
Arquivo exibindo todos os arquivos da pasta C:\ Em seguida se um arquivo for selecionado os dados do arquivo são exibidos no ListView como items e subitems;
|
Para limpar o controle temos o código do botão Limpar onde usamos a propriedade Clear do ListView e reinicializamos o controle para desenhar novamente as colunas com os nomes;
void
BtnLimparClick(object sender, EventArgs e) { lstvDados.Clear(); InicializaListView(); txtNome.Clear(); txtEmail.Clear(); txtFone.Clear(); } |
Para encerrar a aplicação temos o código no evento Click do botão Sair;
void
BtnSairClick(object sender, EventArgs e) { Application.Exit(); } |
Para excluir um item do controle ListView vamos permitir que o usuário pressione a tecla Del e se houver um item selecionado ele será excluído.
void
MainFormKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { for (int i = lstvDados.SelectedItems.Count - 1; i >= 0; i--) { ListViewItem li = lstvDados.SelectedItems[i]; lstvDados.Items.Remove(li); } } } |
Estamos usando o evento Click do ListView para permitir que quando for clicado os dados da linha selecionada sejam exibidos nas caixas de texto no formulário:
void
LstvDadosClick(object sender, EventArgs e) { if ( lstvDados.SelectedItems.Count != 0 ) { if ( lstvDados.SelectedItems[0].Selected ) { txtNome.Text = lstvDados.FocusedItem.SubItems[0].Text; txtEmail.Text = lstvDados.FocusedItem.SubItems[1].Text; txtFone.Text = lstvDados.FocusedItem.SubItems[2].Text; } } } |
Abaixo temos um exemplo desse recurso em execução.
![]() |
A seguir temos uma busca realizada no ListView usando o método FindItemWithText onde ao digitar na caixa de texto nome a linha do item tenha a cor de fundo alterada para aqua;
void
TxtNomeTextChanged(object sender, EventArgs e) { ListViewItem item = lstvDados.FindItemWithText(txtNome.Text); if (item != null) { lstvDados.SelectedItems.Clear(); item.Selected = true; item.BackColor = Color.Aqua; } } |
A seguir temos o código acima em ação onde a linha inteira contendo o item com nome que contenha J tenha sua cor de funda alterada.
![]() |
Como você pôde conferir o controle ListView possui muitos recursos e, é bastante flexível na exibição de dados. Faltou uma rotina para alteração mais otimizada pois no exemplo teremos que excluir um item para em seguida incluir o novo item alterado.
Pegue o projeto completo aqui:
ListViewManu.zip
Eu sei é apenas C# mas eu gosto...
Referências:
José Carlos Macoratti