none
Ignorar acentos no DataTable.RowFilter RRS feed

  • Pergunta

  • Olá,

    Tenho uma pesquisa em um DataTable onde faço o seguinte:

    dataTable.DefaultView.RowFilter = "Nome like '" + tbTexto.Text + "%'";

    Funciona perfeitamente, mas gostaria que ignorasse acentos.

    Isso é possível em um dataTable?

    terça-feira, 18 de setembro de 2012 20:04

Respostas

  • Saulo não existe nenhuma função para normalização de texto que possa ser utilizada no RowFilter, métodos também não suportado dentro do RowFilter. Criar uma coluna nova e atribuir uma Expresion tentando chamar um método també não é possivel.

    Acho que uma alternativa seria criar uma coluna com o nome de "NomeNormalizado" e atribuir o própio nome nela tratado sem os acentos, ai você efetua os filtros nesta coluna, oque você acha ??

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Marcado como Resposta Saulo Vinícius terça-feira, 18 de setembro de 2012 21:21
    terça-feira, 18 de setembro de 2012 20:33

Todas as Respostas

  • Saulo não existe nenhuma função para normalização de texto que possa ser utilizada no RowFilter, métodos também não suportado dentro do RowFilter. Criar uma coluna nova e atribuir uma Expresion tentando chamar um método també não é possivel.

    Acho que uma alternativa seria criar uma coluna com o nome de "NomeNormalizado" e atribuir o própio nome nela tratado sem os acentos, ai você efetua os filtros nesta coluna, oque você acha ??

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Marcado como Resposta Saulo Vinícius terça-feira, 18 de setembro de 2012 21:21
    terça-feira, 18 de setembro de 2012 20:33
  • Vitor,

    Acho que vou fazer isso mesmo, vou trazer no select uma coluna com os dados tratados sem acento e filtrar por ela, estava pensando que poderia haver uma forma de setar o datatable como caseInsensitive, mas não encontrei nada em minha pesquisa, acho que a solução é essa mesmo então.

    Obrigado.

    terça-feira, 18 de setembro de 2012 21:22
  • Saulo você pretende fazer este tratamento na aplicação ou no banco de dados ? Caso seja na aplicação se você quiser posso postar uma solução aqui.


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    terça-feira, 18 de setembro de 2012 21:43
  • Inicialmente estava pensando em fazer isso no banco, mas se você tem  uma solução para esse tratamento na aplicação e poder postar,  pode ser bem útil para mim e para outros.

    Obrigado.

    terça-feira, 18 de setembro de 2012 22:02
  • Saulo usei de um método proposto em um thread para a remoção de acentos:

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/d86d1def-4774-4fd8-b4fc-2f57a12beb85/

    Mudei um pouco o método mais o resultado final é o mesmo:

    private string RemoverAcentos(string texto)
    {
        string returnNormalize = string.Empty;
    
        foreach (var ch in texto.Normalize(System.Text.NormalizationForm.FormD))
        {
            System.Globalization.UnicodeCategory uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(ch);
            if (uc != UnicodeCategory.NonSpacingMark)
                returnNormalize += ch;
        }
        return returnNormalize;
    }

    Agora é só utilizar dele junto de uma consulta usando LINQ para verificar se o nome contem ou não no DataTable:

    string nomeNormalize = RemoverAcentos(txtNome.Text);
    
    IEnumerable<DataRow> resultado =  dataTable.AsEnumerable().Where
                                    (f => 
                                        RemoverAcentos(f.Field<string>("Nome")).Contains(nomeNormalize)
                                    );




    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    terça-feira, 18 de setembro de 2012 23:59
  • Vitor,

    Utilizei o seu método RemoverAcentos e deu certo, só não consegui consumir utilizando LINQ, tenho outra consulta em que não utilizo DataTble e sim uma TList<>, nessa consulta eu passou o filtro dessa forma como você mostrou, mas com dataTable não sei porque o dataTable.AsEnumerable() me retorna vazio, mesmo sem where, bom eu já tinha tentado utilizar os AsEnumerable outras vezes e acabei desistindo, mas para esse caso eu fiz um método em que ao carregar o dataTable adiciono uma coluna e faço um foreach e passo o Nome para a nova coluna utilizando o RemoverAcentos, ta funcionando.

    Obrigado.

    quarta-feira, 19 de setembro de 2012 13:51