none
Problema com retorno de varias linhas RRS feed

  • Pergunta

  • Seguinte, eu tenho uma query que retorna uma string, essa string é mandada para um ListBox. Como normalmente a string é muito grande eu do um substring e adiciono "..." no final dela, pois ela nao caberia no ListBox... Até ai tudo certo, o problema é que asvezes a string tem "Várias Linhas" e quando eu retorno o ListBox fica assim:

    STRING MUITO GRANDE QUE NAO CABE TU...

    SEGUNDA LINHA DA STRING MUITO GRAND...

    Aí está meu problema, eu queria que caso ouvesse 2 linhas, apenas a primeira linha fosse mostrada... pensei e procurei mas nao encontrei uma forma de resolver isso ...

    Eis meu seguinte metodo de retorno

      while (dtrs.Read())
      {
     	 if (dtrs.GetString(0).Length > 30)
          lbox.Items.Add(dtrs.GetString(0).Substring(0, 30) + "...");
         else
          lbox.Items.Add(dtrs.GetString(0));
      }

    Ao infinito e além!
    segunda-feira, 15 de novembro de 2010 22:40

Respostas

  • Fabio,

    Já pensou em primeiro jogar o resultado da leitura em uma List<string> e depois fazer a checagem se só foi lida uma linha ou várias?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    • Sugerido como Resposta Marcus Paulo Couto terça-feira, 16 de novembro de 2010 15:51
    • Marcado como Resposta Fabio R. Luz quarta-feira, 17 de novembro de 2010 14:42
    segunda-feira, 15 de novembro de 2010 23:23
    Moderador
  • Olá Fábio concordo com o André, desta forma que ele propos ficaria algo do tipo em C#:

    List<string> lista = new List<string>();
    
    while (dtrs.Read())
     {
     if (dtrs.GetString(0).Length > 30)
      lista.Add(dtrs.GetString(0).Substring(0, 30) + "...");
     else
      lista.Add(dtrs.GetString(0));
     }
    
     lbox.Items.Add(lista[0]);
    

    Uma outra abordagem que seria possivel seria alterar a QUERY passada ao comando usado para a geração do DataReader:

    Exemplo atualmente se está assim:

    SELECT CAMPO FROM TABELA
    

    Ficaria assim:

    SELECT TOP 1 CAMPO FROM TABELA
    

    A vantagem de se fazer esta forma é que poderia ficar ligeiramente mais rápido, pois traz somente um registro em vez de trazer vários registros desnecessariamente. Fazendo desta forma o código em C# não precisaria ser alterado.

    Atenciosamente


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    terça-feira, 16 de novembro de 2010 16:01
  • Então eu consegui resolver.. na verdade a solução era MUITO SIMPLES...

     Quando eu retorno a query pra uma string, a parte que pula linha tem um "\r\n". Entao foi só tratar...

     string itemCorrente = dtrs.GetString(1);
            if (itemCorrente.IndexOf("\n") > 0)
            {
              int posLineBreak = itemCorrente.IndexOf("\r");
              string questao = itemCorrente.Substring(0, posLineBreak);
    
              if (questao.Length > 30)
                lbox.Items.Add(dtrs.GetInt32(0).ToString() + ". " + questao.Substring(0, 30) + "...");
              else
                lbox.Items.Add(dtrs.GetInt32(0).ToString() + ". " + questao);
            }
    Eu pensei em fazer isso desde o início acontece que, não sei de que forma eu tive a ILUSTRE IDÉIA de que os Controles WPF não aceitam \n para "pular de linha", Daí tinha descartado essa opção... Pórem ao debugar, vi que ao retornar a query aparece "\n" na string. sendo assim apenas "Substringuei" a string apartir do ponto onde o "\r\n" se encontrava...
    Ao infinito e além!
    • Marcado como Resposta Fabio R. Luz quarta-feira, 17 de novembro de 2010 14:41
    quarta-feira, 17 de novembro de 2010 14:40

Todas as Respostas

  • Fabio,

    Já pensou em primeiro jogar o resultado da leitura em uma List<string> e depois fazer a checagem se só foi lida uma linha ou várias?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    • Sugerido como Resposta Marcus Paulo Couto terça-feira, 16 de novembro de 2010 15:51
    • Marcado como Resposta Fabio R. Luz quarta-feira, 17 de novembro de 2010 14:42
    segunda-feira, 15 de novembro de 2010 23:23
    Moderador
  • Olá Fábio concordo com o André, desta forma que ele propos ficaria algo do tipo em C#:

    List<string> lista = new List<string>();
    
    while (dtrs.Read())
     {
     if (dtrs.GetString(0).Length > 30)
      lista.Add(dtrs.GetString(0).Substring(0, 30) + "...");
     else
      lista.Add(dtrs.GetString(0));
     }
    
     lbox.Items.Add(lista[0]);
    

    Uma outra abordagem que seria possivel seria alterar a QUERY passada ao comando usado para a geração do DataReader:

    Exemplo atualmente se está assim:

    SELECT CAMPO FROM TABELA
    

    Ficaria assim:

    SELECT TOP 1 CAMPO FROM TABELA
    

    A vantagem de se fazer esta forma é que poderia ficar ligeiramente mais rápido, pois traz somente um registro em vez de trazer vários registros desnecessariamente. Fazendo desta forma o código em C# não precisaria ser alterado.

    Atenciosamente


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    terça-feira, 16 de novembro de 2010 16:01
  • Então eu consegui resolver.. na verdade a solução era MUITO SIMPLES...

     Quando eu retorno a query pra uma string, a parte que pula linha tem um "\r\n". Entao foi só tratar...

     string itemCorrente = dtrs.GetString(1);
            if (itemCorrente.IndexOf("\n") > 0)
            {
              int posLineBreak = itemCorrente.IndexOf("\r");
              string questao = itemCorrente.Substring(0, posLineBreak);
    
              if (questao.Length > 30)
                lbox.Items.Add(dtrs.GetInt32(0).ToString() + ". " + questao.Substring(0, 30) + "...");
              else
                lbox.Items.Add(dtrs.GetInt32(0).ToString() + ". " + questao);
            }
    Eu pensei em fazer isso desde o início acontece que, não sei de que forma eu tive a ILUSTRE IDÉIA de que os Controles WPF não aceitam \n para "pular de linha", Daí tinha descartado essa opção... Pórem ao debugar, vi que ao retornar a query aparece "\n" na string. sendo assim apenas "Substringuei" a string apartir do ponto onde o "\r\n" se encontrava...
    Ao infinito e além!
    • Marcado como Resposta Fabio R. Luz quarta-feira, 17 de novembro de 2010 14:41
    quarta-feira, 17 de novembro de 2010 14:40