Array
(
)

Pesquisar valor num datagridview

Sávio Costa
   - 12 set 2010

Tenho um Forms, onde tenho um datagridview. Quero fazer uma pesquisa com o valor de um textbox para uma coluna específica do datagridview, alguém pode me ajudar?

   

Vinicius Vieira
   - 15 set 2010

Cara, acredito que a melhor forma de se fazer seria ligando o datagrid a um bindingsource e filtrando o bindingsource, fica quase a mesma coisa que está só que em vez de você alimentar diretamente o datagrid você alimenta o bindingsource e faz os filtros nele, vou colocar aqui um exemplo do que eu estou falando, que é da lista pesquisa básica do meu sistema, nela tem um textbox que o cara consulta e já vai fazendo o filtro e dependendo da coluna que você clicar no datagrid altera o campo de filtro.
obs: para ligar o datagrid no bindingsource vc vai na toolbox e arrasta um componente bindingsource para a tela e depos clica no data grid e em cima dele vai aparecer uma setinha você clica e na comobox choose data source você escolhe o binding que acabou de criar //Eu declaro um variavel filtro que muda de acordo com a coluna clicada que vai ser o que eu vou usar para filtrar o binding posteriormente.        protected string filtro = "ID LIKE '{0}%'";                                  //no evento cellclick do datagrid eu mudo essa string filto com o nome do campo no binding o {0} será o valor do textbox, mudo também um lable que retula o textbox onde se digita o que vai pequisar        public void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)        {            if (dtgListaPesquisaBase.Rows.Count > 0 && e.ColumnIndex!=-1)            {                lblFiltro.Text = dtgListaPesquisaBase.Columns[e.ColumnIndex].HeaderText + ":";                filtro = dtgListaPesquisaBase.Columns[e.ColumnIndex].DataPropertyName + " LIKE '{0}%'";            }        }//no evento textchanged do textbox eu já vou fazendo o filtro se esse boleano FiltroNaDigitaca estiver marcado assim a pesquisa é restringida a cada caractere que o cara vai digitando.        public void txtFiltro_TextChanged(object sender, EventArgs e)        {            if (FiltroNaDigitacao)            {                if (bindingSource1.DataSource != null)                {                    if (filtro == string.Empty)                    {                        lblFiltro.Text = dtgListaPesquisaBase.Columns[IndiceColunaInicial].HeaderText + ":";                        filtro = dtgListaPesquisaBase.Columns[IndiceColunaInicial].DataPropertyName+ " LIKE '{0}%'";                    }
                        string valor = txtFiltro.Text.Trim();                        if (valor == string.Empty)                        {                            bindingSource1.Filter = valor;                        }                        else                        {  //AQUI É ONDE DE FATO SE FAZ O FILTRO NO BINDINGSOURCE eu passo o valor daquela string filtro substituindo o {0} pelo valor do textbox                             bindingSource1.Filter = string.Format(filtro, valor);                        }                                    }            }        }
       //Eu tenho a opcao de deixar o cara digitar tudo e depois clicar e nesse método é onde eu faço essa pesquisa                private void btnPesquisar_Click(object sender, EventArgs e)        {            if (bindingSource1.DataSource != null)            {                if (filtro == string.Empty)                {                    lblFiltro.Text = dtgListaPesquisaBase.Columns[dtgListaPesquisaBase.FirstDisplayedCell.ColumnIndex].HeaderText+":";                    filtro = dtgListaPesquisaBase.Columns[dtgListaPesquisaBase.FirstDisplayedCell.ColumnIndex].DataPropertyName + " LIKE '{0}%'";                }
                string valor = txtFiltro.Text.Trim();                if (valor == string.Empty)                {                    bindingSource1.Filter = valor;                }                else                {  //AQUI É ONDE DE FATO SE FAZ O FILTRO NO BINDINGSOURCE eu passo o valor daquela string filtro substituindo o {0} pelo valor do textbox                     bindingSource1.Filter = string.Format(filtro, valor);                }            }        }    espero ter ajudado            

Rafael Tomitão
   - 19 set 2010

Olá,

Uma dúvida, eu acesso o banco, e na classe de negócio eu crio uma List<> e faço o filtro pela List<>.
Por exemplo

#Código

   List<Aluno> alu;
   alu = escola.Alunos.FindAll(delegate(Aluno a)
   {
         return a.nome.StartsWith(textBox1.Text);
   });
   if (alu != null)
  {
        dataGridView1.DataSource = alu;
  }


assim é errado?

Obs.: Uso C#.net + MySql (sem ODBC)

grato,

Rafael Tomitão

Vinicius Vieira
   - 20 set 2010

Rafael, errado não é.No meu caso eu faço pelo bindingsource porque em tempo de execução eu mudo o campo de filtro, apenas alterando a string filter, o binding também proporciona um certa abstração porque posso alimentar-lo com um lista ou um datatable por exemplo e depois utilizar-lo da mesma forma, se no seu caso na hora que você acessa o banco você já conhece o filtro ou seja você sabe que vai procurar por nomes que começam com "V" por exemplo, já coloca isso na sua query fica mais rápido pois você só carrega em memória o que você precisa sem contar que o banco de dados é muito mais rápido para fazer filtros nas tabelas do que o c# nas coleções(falando de forma genérica). Outra coisa, você reparou que precisou fazer um "if alu!=null" para carregar o datagrid1.datasource ? isso seria evitado se utilizasse o bindingsource um comparação a menos que poderia otimizar seu código. Pelo forma que está seu código PARECE que você está consultando novamente o bd a cada alteração de filtro e isso sim estaria errado. Concluindo não está necessariamente errado, mas seria mais elegante, mais rápido e relativamente mais fácil utilizar um binding pois o mesmo foi criado justamente com esse propósito, no seu código você retorna um lista filtrado no meu binding os registros continuam da mesma forma só respeitando o filter se eu coloco filter = "" todos registro voltam a parecer da mesma forma no grid. Espero ter ajudado não sou muito didático, mas qualquer dúvida posta ai.

Rafael Tomitão
   - 20 set 2010

Vinicius,

Pra falar a verdade eu nunca usei o bindingsource. Por isso perguntei.

E sobre o exemplo que citei, eu acesso o banco somente uma vez, preencho a List<Aluno> e depois o filtro eu aplico diretamente na Lista, não volto ao banco para buscar mais nada.
Estive lendo na .net magazine desse mês sobre o Linq, e também da pra fazer o filtro por ele.

usando o bindingsource, vc vai ao banco só uma vez?
Por exemplo vc busca todos os alunos e depois aplica o filtro somente no bindingsource?

da pra eu usar o bindingsource com mysql sem ODBC?

grato,

Rafael Tomitão

Vinicius Vieira
   - 21 set 2010

  Sim vou ao banco somente uma vez,e da para usar com mysql sem ODBC sim, pois você vai alimentar-lo com uma coleção eu por exemplo alimento com um datatable, e depois faço o filtro. ;D