C# - Trabalhando com o objeto DataTable
No artigo de hoje vou escrever um pouco sobre a classe DataTable que representa uma tabela de dados na memória mostrando como realizar as operações mais usadas com esse recurso na linguagem C#. |
Um DataTable
é como um container que podemos usar para armazenar informações de praticamente
qualquer fonte de dados, sendo composto por uma coleção de linhas (rows)
e colunas (columns)
Podemos criar um DataTable para armazenar dados em memória e realizar operações para incluir, alterar e excluir essas informações.
O
Podemos criar objetos DataTable via código adicionando linhas e colunas de acordo com nossa necessidade.
A classe DataTable esta presente no namespace System.Data.
Neste artigo vou mostrar como realizar as seguintes operações com a classe DataTable:
Recursos usados :
Criando o projeto no VS 2013 Express Edition
Abra o VS 2013 Express for Windows desktop e clique em New Project;
A seguir selecione Visual C# -> Windows Forms Application;
Informe o nome Usando_DataTable e clique no botão OK;
A seguir incluir no arquivo form1.cs o seguintes controles a partir da Toolbox:
1 DataGridView - dgvDados
1 ListBox - lbDados
1 Combobox - cboCampo
1 TextBox - txtCriterio
8 Buttons - btnCriarDataTable, btnSelecionarDados,
btnConsultaLINQ, btnConsultaLINQ_2, ConsultaLINQ_ExpressaoLambda,
btnDataTable_XML, btnXML_DataTable e btnList_DataTable
O leiaute da aplicação deverá esta conforme a figura abaixo:
No evento Click de cada botão de comando vamos implementar a respectiva funcionalidade.
Namespaces usado no formulário:
using
System;Definição das variáveis dtb_Alunos e txtCaminhoArquivo no início do formulário:
DataTable dtb_Alunos;1- Criar e Exibir Datatable
private void btnCriarDataTable_Click(object sender, EventArgs e)
{
DataTable tabela = CriarDataTable();
dgvDados.DataSource = tabela;
}
|
O código do método CriarDataTable() é mostrado a seguir:
private DataTable CriarDataTable()
{
dtb_Alunos = new DataTable();
dtb_Alunos.Columns.Add("AlunoId", typeof(int));
dtb_Alunos.Columns.Add("Nome", typeof(string));
dtb_Alunos.Columns.Add("Email", typeof(string));
dtb_Alunos.Columns.Add("Telefone", typeof(string));
dtb_Alunos.Columns.Add("Idade", typeof(int));
dtb_Alunos.Rows.Add(1, "Macoratti", "macoratti@yahoo.com", "44669922", 45);
dtb_Alunos.Rows.Add(2, "Jefferson", "jeff@bol.com.br", "88669977", 23);
dtb_Alunos.Rows.Add(3, "Janice", "janjan@uol.com.br", "96885522", 20);
dtb_Alunos.Rows.Add(4, "Jessica", "jessicalang@uol.com.br", "96885522", 25);
dtb_Alunos.Rows.Add(5, "Miriam", "mimi@uol.com.br", "96885522", 48);
return dtb_Alunos;
}
|
Neste código estamos criando um DataTable chamado dtb_Alunos com 5 colunas e a seguir adicionamos 5 linhas referente a dados de alunos : AlunoId, Nome, Email, Telefone e Idade.
2- Selecionar Dados
private void btnSelecionarDados_Click(object sender, EventArgs e)
{
string AlunoId ="";
string Nome="";
string Email="";
string Telefone = "";
string Idade="";
string campo = cboCampo.Text;
string criterio = txtCriterio.Text;
string comando;
if (campo == "AlunoId" || campo == "Idade")
{
comando = campo + "=" + criterio;
}
else
{
comando = campo + "=" + "'" + criterio + "'";
}
DataRow[] oDataRow = dtb_Alunos.Select(comando);
foreach (DataRow dr in oDataRow)
{
//usei 3 sintaxes diferentes para obter os valores
AlunoId = dr[0].ToString();
Nome = dr["Nome"].ToString();
Email = dr[2].ToString();
Telefone = dr[3].ToString();
Idade = dr.Field<int>(4).ToString();
}
lblSelecao.Text = AlunoId + " " + Nome + " " + Email + " " + Telefone + " " + Idade;
}
|
O código acima cria 5 variáveis do tipo string para receber as informações da tabela dtb_Alunos.
A seguir montamos uma consulta composta pelo nome do campo definido na combobox - cboCampo e pelo critério definido na caixa de texto txtCriterio.
Após montar a consulta na variável comando usamos o método Select para selecionar a linha com critério escolhido e usamos um laço foreach para percorrer o resultado e obter os dados.
Para exibir o resultado concatenamos os valores em um controle Label - lblSelecao.
3- Consultar usando LINQ
private void btnConsultaLINQ_Click(object sender, EventArgs e)
{
//consulta usando LINQ
IEnumerable consulta = from aluno in dtb_Alunos.AsEnumerable()
select aluno;
foreach (DataRow dr in consulta)
{
lbDados.Items.Add(dr.Field<int>("AlunoId") + " - " + dr.Field<string>("Nome"));
}
}
|
Para podemos realizar uma consulta LINQ em um DataTable temos usar o
método DataTableExtensions.AsEnumerable() do namespace System.Data
que retorna
4- Consulta LINQ (tipo anônimo)
private void btnConsultaLINQ_2_Click(object sender, EventArgs e)
{
var consulta = from p in dtb_Alunos.AsEnumerable()
where p.Field<string>(cboCampo.Text) == txtCriterio.Text
select new
{
nome = p.Field<string>("Nome"),
idade = p.Field<int>("Idade"),
fone = p.Field<string>("Telefone")
};
lbDados.Items.Clear();
//exibe o tipo anônimo
foreach (var aluno in consulta)
{
lbDados.Items.Add(aluno.nome + " " + aluno.idade + " " + aluno.fone);
}
}
|
Nesta consulta LINQ estamos criando um tipo anônimo (nome, idade e fone) com base em uma consulta montada com os valores selecionados nos controles cboCampo e txtCriterio.
5- Expressão Lambda
private void ConsultaLINQ_ExpressaoLambda_Click(object sender, EventArgs e)
{
var consulta = from aluno in dtb_Alunos.AsEnumerable()
select aluno;
IEnumerable alunos = consulta.Where(c => c.Field<string>("Nome").Contains("J"));
lbDados.Items.Clear();
//Todos os nomes que contem "J"
foreach (DataRow aluno in alunos)
{
lbDados.Items.Add(aluno.Field<string>("Nome"));
}
}
|
Nesta consulta LINQ usamos uma expressão lambda para obter os nomes que contém a letra J.
6- DataTable => XML
private void btnDataTable_XML_Click(object sender, EventArgs e)
{
try
{
dtb_Alunos.TableName = "Alunos";
dtb_Alunos.WriteXml(txtCaminhoArquivo);
MessageBox.Show("Arquivo XML gerado com sucesso");
System.Diagnostics.Process.Start(txtCaminhoArquivo);
}
catch(Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
}
|
Para gerar um XML a partir do Datatable usamos o método WriteXML() passando o caminho e nome do arquivo xml.
7- XML => DataTable
private void btnXML_DataTable_Click(object sender, EventArgs e)
{
try
{
dtb_Alunos.ReadXml(txtCaminhoArquivo);
dgvDados.DataSource = dtb_Alunos;
}
catch (Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
}
|
Para converter de XML para DataTable apenas usamos o método ReadXml() informando o caminho e nome do arquivo xml.
8- List => DataTable
private void btnList_DataTable_Click(object sender, EventArgs e)
{
// Examplo de lista : seleções da copa américa
List<string[]> oLista = new List<string[]>();
oLista.Add(new string[] { "Brasil", "Peru", "Venezuela" , "Colômbia" });
oLista.Add(new string[] { "Argentina", "Paraguai", "Uruguai", "Jamaica" });
oLista.Add(new string[] { "Chile", "Bolívia", "México", "Equador" });
// Converte para DataTable
DataTable oDataTable = ConverteLista_DataTable(oLista);
dgvDados.DataSource = oDataTable;
}
|
O código acima cria uma lista de strings contendo as seleções da copa América. A seguir chamamos o método ConverteLista_DataTable() passando a lista criada e exibimos o DataTable retornado no DataGridView.
O código do método ConverteLista_DataTable é dado a seguir :
private DataTable ConverteLista_DataTable(List<string[]> oLista)
{
// Nova tabela
DataTable oDataTable = new DataTable();
// no maximo colunas
int colunas = 0;
foreach (var array in oLista)
{
if (array.Length > colunas)
{
colunas = array.Length;
}
}
// Adiciona colunas
for (int i = 0; i < colunas; i++)
{
oDataTable.Columns.Add();
}
// Adiciona linhas
foreach (var array in oLista)
{
oDataTable.Rows.Add(array);
}
return oDataTable;
}
|
Executando o projeto e selecionando a guia HTML para XAML e colando um trecho de código HTML conforme abaixo:
Pegue o projeto completo aqui: Usando_Datatable.zip
Então
disse Jesus aos seus discípulos: Se alguém quiser vir após mim, renuncie-se a si
mesmo, tome sobre si a sua cruz, e siga-me;
Mateus 16:24
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências: