C# - Acesso a dados - Preenchendo um DataGridView


Atendendo diversos pedidos vou publicar uma série de artigos mostrando como efetuar o acesso a dados usando a linguagem C#.

Para começar vou mostrar como preencher um controle DataGriView em uma aplicação Windows Forms. Vamos lá...

Para acompanhar os exemplos mostrados no artigo você deve possuir instaladas as seguintes ferramentas:

- Visual C# Express Edition ou o SharpDevelop 2.2

Eu vou começar usando o SharpDevelop 2.2 apenas para variar mas você pode usar o Visual C# Express 2008.

1- Preenchendo o DataGridView com dados de um banco de dados Access com um DataTable

Vou criar uma solução Windows para exibir os dados da tabela Clientes do banco de dados Cadastro.mdb cuja estrutura é a seguinte:

Abra o SharpDevelop e no menu Arquivo selecione Novo e em seguida Solução;

Na janela Novo Projeto selecione C#->Aplicações Windows e na janela Modelos marque Aplicação Windows e informe o nome da solução , no meu caso: AcessoDadosC;

A partir da janela Ferramentas abra a guia Data e selecione o controle DataGridView arrastando-o para o formulário e configurando sua propriedade Dock para Top. A seguir na guia Windows Forms arraste o controle Button para o formulário e defina sua propriedade Dock para Botton. O resultado final você vê na figura abaixo:

Inclua agora o código do botão C# associado ao evento Click do botão conforme abaixo:

void Button1Click(object sender, EventArgs e)
{
//define a string de conexao com provedor caminho e nome do banco de dados
string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";
//define a instrução SQL
string strSql = "SELECT * FROM Clientes";

//cria a conexão com o banco de dados
OleDbConnection con = new OleDbConnection(strProvider);
//cria o objeto command para executar a instruçao sql
OleDbCommand cmd = new OleDbCommand(strSql, con);

//abre a conexao
con.Open();

//define o tipo do comando
cmd.CommandType = CommandType.Text;
//cria um dataadapter
OleDbDataAdapter da = new OleDbDataAdapter(cmd);

//cria um objeto datatable
DataTable clientes = new DataTable();

//preenche o datatable via dataadapter
da.Fill(clientes);

//atribui o datatable ao datagridview para exibir o resultado
dataGridView1.DataSource = clientes;
}

Nota: Lembrando que temos que declarar os namespaces :

using System.Data;
using
System.Data.OleDb
;

O código acima esta todo comentado e retorna todos os dados da tabela Clientes exibindo-os no DataGridView conforme abaixo:

2- Exibindo os dados em um DataGridView com DataReader

Se você desejar usar o DataReader (OledDb ou Sql) para ler os registros da tabela e exibir no DataGridView vai ter um pouco mais de trabalho pois não poderá atribuir o objeto DataReader a propriedade DataSource do controle.

A estratégia que você deverá seguir é a seguinte:

1- Obter quantas colunas existe na tabela;

2- Ler o nome de cada coluna e criar o cabeçalho no DataGridView;

3- Ler cada um dos registros e verificar qual o tipo de dados de cada uma das colunas;

4- Obter o valor da coluna usando o método apropriado;

Vamos incluir um novo controle Button no formulário e digitar o código abaixo no seu evento Click():

void Button2Click(object sender, EventArgs e)

{

//define a string de conexao com provedor caminho e nome do banco de dados

string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";

//define a instrução SQL

string strSql = "SELECT * FROM Clientes";

//cria a conexão com o banco de dados

OleDbConnection con = new OleDbConnection(strProvider);

//cria o objeto command para executar a instruçao sql

OleDbCommand cmd = new OleDbCommand(strSql, con);

//abre a conexao

con.Open();

//define o tipo do comando

cmd.CommandType = CommandType.Text;

//obtem um datareader

OleDbDataReader dr = cmd.ExecuteReader();

 

//Obtem o número de colunas

int nColunas = dr.FieldCount;

 

//percorre as colunas obtendo o seu nome e incluindo no DataGridView

for (int i=0; i < nColunas; i++)

{

     dataGridView1.Columns.Add(dr.GetName(i).ToString() ,dr.GetName(i).ToString());

}

}

Note que repetimos o código inicial sendo que o código destacado em amarelo é o código novo. Executando a solução e clicando no botão - Preencher com DataReader -  iremos obter:

Já temos os cabeçalhos das colunas no DataGridView criadas com os nomes das colunas da tabela Clientes falta percorrer os registros e preencher o controle.

Para fazer isso devemos tomar os seguintes cuidados:

- Quanto obtemos o dado de um coluna em um DataReader temos que especificar o tipo de dados pois a um método para cada tipo de dados; assim em uma coluna do tipo Integer devemos usar o método GetInt32() para obter o valor.

- Então temos que percorrer cada linha da tabela e verificar em cada coluna qual o tipo de dados para usar o método adequado e obter o seu valor;

- Para saber o tipo de dados de um coluna usaremos o método GetFieldType() verificando se o mesmo é uma string (System.String) ou um inteiro (System.Int32) ou uma data (System.Date)

O código que devemos incluir para obter o resultado esperado pode ser visto a seguir:

void Button2Click(object sender, EventArgs e)

{

//define a string de conexao com provedor caminho e nome do banco de dados

string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";

//define a instrução SQL

string strSql = "SELECT * FROM Clientes";

//cria a conexão com o banco de dados

OleDbConnection con = new OleDbConnection(strProvider);

//cria o objeto command para executar a instruçao sql

OleDbCommand cmd = new OleDbCommand(strSql, con);

//abre a conexao

con.Open();

//define o tipo do comando

cmd.CommandType = CommandType.Text;

//obtem um datareader

 

OleDbDataReader dr = cmd.ExecuteReader();

int nColunas = dr.FieldCount;

for (int i=0; i < nColunas; i++)

{

dataGridView1.Columns.Add(dr.GetName(i).ToString() ,dr.GetName(i).ToString());

}

 

//define um array de strings com nCOlunas

string[] linhaDados = new string[nColunas];

//percorre o DataRead

while (dr.Read())

{

     //percorre cada uma das colunas

     for (int a =0 ; a < nColunas; a++)

    {

        //verifica o tipo de dados da coluna

        if (dr.GetFieldType(a).ToString() == "System.Int32")

      {

            linhaDados[a] = dr.GetInt32(a).ToString();

      }

       if (dr.GetFieldType(a).ToString() == "System.String")

     {

           linhaDados[a] = dr.GetString(a).ToString();

       }

         if (dr.GetFieldType(a).ToString() == "System.DateTime")

     {

           linhaDados[a] = dr.GetDateTime(a).ToString();

      }

   }

    //atribui a linha ao datagridview

    dataGridView1.Rows.Add(linhaDados);

}

}

O código que foi incluído esta destacado em amarelo. Executando o projeto iremos obter:

Embora aborde conceitos básicos este artigo mostrou como podemos tratar os dados a partir de um DataReader exibindo-os em um DataGridView() usando C#.

Pegue o projeto completo para SharpDevelop aqui:  AcessoDadosC.zip

Referências:


José Carlos Macoratti