Neste artigo vou mostrar como realizar uma busca dinâmica em um DataGridView que está exibindo dados importados do Excel usando a linguagem C#.
Vamos criar uma aplicação Windows Forms na linguagem C# que vai importar um arquivo Excel exibindo os dados em um DataGridView. Em seguida vamos criar o código para realizar uma busca dinâmica no DataGridView.
Recursos usados:
- VS 2017 Community (update 15.4.2)
- Excel (97-2003 e/ou 2007 o superior)
Criando o projeto Windows Forms
Abra o VS 2017 Community e crie um projeto do tipo Windows Forms App com o nome C_BuscaDinamica:
No formulário Form1.cs do projeto inclua os seguintes controles:
- 1 Combobox – cboBusca
- 1 TextBox – txtCriterio
- 2 Buttons – btnProcurar, btnExibirTodos
- 1 DataGridView – dgvDados
- 1 TextBox – txtArquivoExcel
- 2 Buttons – btnLocalizarArquivoExcel, btnImportaExcel
- 1 OpenFileDialog – ofd1
Disponha os controles conforme o layout da figura abaixo:
Declare os seguintes namespaces no formulário:
using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Windows.Forms;
No início do formulário defina uma variável chamada arquivoExcel que vai conter o nome do nosso arquivo Excel que criaremos a seguir:
string arquivoExcel = @”NotasAlunos2017.xlsx”;
Preparando o arquivo Excel
Agora crie um arquivo Excel ou use um já existente. Criarei um arquivo chamado NotasAlunos.xlsx no Excel 2017 com o seguinte conteúdo:
Implementando as funcionalidades no formulário
Vou usar uma abordagem bem simples, onde vamos definir todo o código no formulário do projeto. Fiz assim para tornar o exemplo mais simples.
1- Criando o método para importar o arquivo Excel
Este método será usado para importar os dados do Excel e exibí-los no DataGridView:
private void CarregaDadosExcel() { try { //limpa o combobox cboBusca.Items.Clear(); //converte os dados do Excel para um DataTable DataTable dt = GetTabelaExcel(arquivoExcel); //ajusta a largura das colunas aos dados dgvDados.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dgvDados.DataSource = dt; //No total de registros lblRegistros.Text = (dgvDados.Rows.Count - 1).ToString(); string[] listaNomeColunas = dt.Columns.OfType<DataColumn>().Select(x => x.ColumnName).ToArray(); //Adiciona os nomes das colunas no Combobox cboBusca.Items.AddRange(listaNomeColunas); if (cboBusca.Items.Count > 0) cboBusca.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show("Erro :" + ex.Message); } }
Esse código obtém os dados do arquivo Excel e o converte para um DataTable preenchendo o combobox com os nomes das colunas e exibindo os dados no datagridview.
Precisamos definir o método GetTabelaExcel (arquivoExcel) cujo código é mostrado a seguir:
private DataTable GetTabelaExcel(string arquivoExcel) { DataTable dt = new DataTable(); try { //pega a extensão do arquivo string Ext = Path.GetExtension(arquivoExcel); string connectionString = ""; //verifica a versão do Excel pela extensão if (Ext == ".xls") { //para o Excel 97-03 connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'"; } else if (Ext == ".xlsx") { //para o Excel 07 e superior connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'"; } OleDbConnection conn = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); cmd.Connection = conn; conn.Open(); DataTable dtSchema; dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string nomePlanilha = dtSchema.Rows[0]["TABLE_NAME"].ToString(); conn.Close(); //le todos os dados da planilha para o Data Table conn.Open(); cmd.CommandText = "SELECT * From [" + nomePlanilha + "]"; dataAdapter.SelectCommand = cmd; dataAdapter.Fill(dt); conn.Close(); } catch (Exception ex) { throw ex; } return dt; }
Neste código verificamos qual a versão do Excel pela extensão do arquivo informado, e a seguir montamos a string de conexão para obter os dados da planilha e exibir no DataGridView.
2- Código dos botões para localizar e importar o arquivo Excel
Vamos definir o código no evento Click do botão de comando para localizar o arquivo Excel:
private void btnLocalizaArquivoExcel_Click(object sender, EventArgs e) { DialogResult drResult = ofd1.ShowDialog(); if (drResult == System.Windows.Forms.DialogResult.OK) txtArquivoExcel.Text = ofd1.FileName; }
Neste código vamos abrir uma caixa de diálogo OpenFileDialog e atribuir o nome do arquivo selecionado na caixa de texto.
Depois, vamos definir o código do evento Click do botão Importar Excel:
private void btnImportaExcel_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtArquivoExcel.Text) && File.Exists(txtArquivoExcel.Text)) { arquivoExcel = txtArquivoExcel.Text; CarregaDadosExcel(); } else { CarregaDadosExcel(); } }
3- Código dos botões “Procurar” que realizam a busca dinâmica “Exibir Todos”, que por sua vez exibe todos os registros
Para concluir, definiremos o código do botão “Procurar”:
private void btnProcurar_Click(object sender, EventArgs e) { try { ((DataTable)dgvDados.DataSource).DefaultView.RowFilter = string.Format("" + cboBusca.Text + " like '%{0}%'", txtCriterio.Text.Trim().Replace("'", "''")); lblRegistros.Text = (dgvDados.Rows.Count - 1).ToString(); } catch (Exception ex) { MessageBox.Show("Erro :" + ex.Message); } }
Neste código estamos usando um DefaultView.RowFilter que define a expressão usada para filtrar quais linhas são exibidas no DataView.
Na consulta, obtemos o nome da coluna do combobox e o critério informado na caixa de texto usando a cláusula like ‘%{0}%’.
A seguir, temos o código do evento Click do botão “Exibir Todos”:
private void btnExibirTodos_Click(object sender, EventArgs e) { CarregaDadosExcel(); }
Executando o projeto, iremos obter:
1- Carregando os dados da planilha Excel no DataGridView e preenchendo o combobox:
2- Realizando uma consulta filtrando pelo Curso igual a Contabilidade:
Pegue o código do projeto aqui: C_BuscaDinamica.zip