Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
-------------------------------------------
Periodo: 2011 09
-------------------------------------------
Periodo: 2021 08
-------------------------------------------
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:
/applications/core/interface/imageproxy/imageproxy.php?img=http://padresergio.com/imagens_ram/novoSite/compromissosCelular.gif&key=3a77f369cdc17ac7cb4978291cb8c352b7a23eac6239682289def8184278ac47" alt="compromissosCelular.gif" />
Agradeço a todos que se empenharem em me ajudarem. ;)
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.
/applications/core/interface/imageproxy/imageproxy.php?img=http://padresergio.com/imagens_ram/novoSite/compromissosCelular.gif&key=3a77f369cdc17ac7cb4978291cb8c352b7a23eac6239682289def8184278ac47" alt="compromissosCelular.gif" />
há é, me esqueci do predicado: var teste01 in teste.dia.OrderByDescing(a => a.agcDataInicio));
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:
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.!
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()