Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RAM WEB

[Resolvido] Consulta LINQ com exibição em Repeater Aninhado

Recommended Posts

Mais uma vez pessoal venho pedir a ajuda de você para solucionar um problema. Preciso montar uma agenda de compromissos, mas essas deve ser aninhada por mês/ano em ordem crescente. Os registros filtrados devem aparecer também em ordem crescente, onde os aniversariantes aparecem antes dos compromissos.

Numa filtragem por mês, já consegui mostrar os aniversariantes antes dos compromissos. Mas não estou conseguindo fazê-lo em grupo. Criei um algoritmo que consegue montar essa agenda para mim, mas consegui coloca-la funcionar apenas dentro de um textbox com multiplas linhas. O codigo segue abaixo:

 

public void agruparDados()
   {

       StringBuilder sb = new StringBuilder();
       entRAM ram = new entRAM();
       var objram = from p in ram.agendacompromissos.ToList()
                    where p.agcAgenda != 2
                    orderby p.agcHoraInicio ascending

                    //grupo pegando mm-aaaa do registro
                    group p by p.agcDataInicio.ToString().Substring(6, 4) + p.agcDataInicio.ToString().Substring(3, 2) into grupo
                    select new
                    {
                        mesAno = grupo.Key,
                        dia = grupo
                    };

       foreach (var teste in objram)
       {
           sb.AppendLine("Periodo: " + teste.mesAno);
           sb.AppendLine("-------------------------------------------");

           foreach (var teste01 in teste.dia)
           {
               sb.AppendLine("- " + teste01.agcDataInicio + " - " + teste01.agcAssunto);
           }

           sb.AppendLine(" ");
       }
       TextBox1.Text = sb.ToString();
   }

 

Na execução desse algoritmo obtenho o seguinte resultado: Filtragem por período em ordem crescente, mas os registros aninhados não ficam em ordem.

 

Periodo: 2011 08

-------------------------------------------

- 19/08/2011 00:00:00 - hora igual

- 31/08/2011 00:00:00 - Compromisso Futuro

- 17/08/2011 00:00:00 - Teste

- 19/08/2011 00:00:00 - Desenhar a casa

- 19/08/2011 00:00:00 - Inserir Banco de Dados 02

- 17/08/2011 00:00:00 - Compromisso 01

- 19/08/2011 00:00:00 - Teste

- 17/08/2011 00:00:00 - Novo compromisso

- 19/08/2011 00:00:00 - Novo registro

- 19/08/2011 00:00:00 - fgdfggh

- 19/08/2011 00:00:00 - asasasa asdada

- 19/08/2011 00:00:00 - gfhghghfg

 

Periodo: 2011 09

-------------------------------------------

- 05/09/2011 00:00:00 - Setembro

 

Periodo: 2021 08

-------------------------------------------

- 19/08/2021 00:00:00 - Inserir Banco de Dados

 

 

 

Esse resultado foi exibido dentro do textbox após ser armazenado num StringBuilder, como disse, mas precisava portanto, que o resultado foi enviado para o repeater que possuo em minha página, pois nele estão configurado a exibição dos dados conforme imagem que atribuirei ao fim desse post. Os campos no repeater estão no formato:

 

<%#Eval("assunto") %>

 

Tentei colocar no repeater componentes label e atribuir valor a eles no code behind por exemplo

lblAssunto.text = obj.assunto;

, mas não consegui acessar o label via code, pois ele está dentro do repeater. Se alguem souber e puder esclarecer como acessar componente dentro do repeater agradeço tb.

 

Em resumo, depois desse testamento todo, preciso da ajuda de vocês para montar essa consulta LINQ (GROUP) de forma que eu consiga apresentar os registros num repeater aninhado. A idéia é como da figura que segue:

 

compromissosCelular.gif

 

Agradeço a todos que se empenharem em me ajudarem. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só, da forma que você montou no TextBox, você pode montar uma estrutura em tabela ou div, e desenhar do mesmo jeito. mas para os aniversários virem primeiro tem que ter um identificador, para diferenciá-los.

Quanto a ordem basta um OrderByDescing em foreach (var teste01 in teste.dia.OrderByDescing()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ivan.Teles segui teu conselho e deu certinho a inserção dos registros. Atribui tudo numa string e coloquei seu resultado num textbox. A única coisa que ainda não consegui foi a ordenação dos dados internamente. Colocar OrderByDescing como você apresentou [foreach (var teste01 in teste.dia.OrderByDescing())] não funcionou, pois ele necessita de parâmetros para executar. Infelizmente não compreendi o que devo colocar nesses parâmetros. Meu código está assim:

 


var objram = from p in ram.agendacompromissos.ToList()
             where p.agcAgenda != 2

             group p by p.agcDataInicio.ToString().Substring(6, 4) + p.agcDataInicio.ToString().Substring(3, 2) into grupo
                    orderby grupo.Key

             select new
             {
                  mesAno = grupo.Key,
                  dia = grupo
             };


          foreach (var x in objram)
         {
             foreach (var y in x.dia)
             { ... }
         }

 

Agradeço se puder me ajudar com essa questão da ordenação dos dados internos, ou seja, ordenar por Data e em seguida por horario. Mais uma vez, obrigado por sua dica anterior.

 

compromissosCelular.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, muito obrigado. Deu certinho. :joia: :clap:

Aproveito o momento para perguntar-lhe se conhece algum bom material (tutorial web, livro, e-book) sobre como montar os predicados ("lambda" expression). Ainda não consegui entender a lógica de como montá-los.

Essa é a primeira vez que utilizo LINQ e Entity DataSource e estou ainda um pouco desencontrado com a semântica da linguagem.

Mais uma vez obrigado por sua valorosa ajuda. :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, compra um LINQ guia de Bolso é muito bom, ajuda bastante. Quanto ao pedicate, não achei muita coisa na net não, mas com o tempo você vai pegando as manhas.!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.