RAM WEB 0 Denunciar post Postado Agosto 20, 2011 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: Agradeço a todos que se empenharem em me ajudarem. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Ivan.Teles 23 Denunciar post Postado Agosto 22, 2011 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
RAM WEB 0 Denunciar post Postado Agosto 23, 2011 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. Compartilhar este post Link para o post Compartilhar em outros sites
Ivan.Teles 23 Denunciar post Postado Agosto 23, 2011 há é, me esqueci do predicado: var teste01 in teste.dia.OrderByDescing(a => a.agcDataInicio)); Compartilhar este post Link para o post Compartilhar em outros sites
RAM WEB 0 Denunciar post Postado Agosto 24, 2011 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
Ivan.Teles 23 Denunciar post Postado Agosto 24, 2011 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