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
  • ListView
    • Name= lstvDados
    • FullRowSelect = True
    • GridLines = True
    • ForeColor = Blue
    • View = Details
  • TextBox
    • txtNome
    • txtEmail
    • txtFone
  • Button
    • Name=btnIncluir
    • Name=btnSalvar
    • Name=btnAbrir
    • Name=btnLimpar
    • Name=btnSair
  • SaveFileDialog
    • Name = sfd
  • OpenFileDialog
    • Name = odlg
  • MainForm.cs
    • KeyPreView = True

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
   for (int i = 0; i < this.lstvDados.Items.Count; i++)
   {
      for (int j=0; j<this.lstvDados.Items[i].SubItems.Count; j++)
       {
           string tab = (j==0) ? string.Empty : "\t";
           m_streamWriter.Write(tab + lstvDados.Items[i].SubItems[j].Text);
       }
      m_streamWriter.WriteLine();
    }

   //limpa e fecha o stream 
   m_streamWriter.Flush();
   m_streamWriter.Close();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

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