Вложенная групповая ссылка LINQ to treeview - PullRequest
2 голосов
/ 20 января 2012

У меня есть список в следующем формате:

List<Amortizacion> lista = new List<Amortizacion>
        {
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=1, Ngrupo="Jorge", Npersona="Jorge", Monto=500m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Noe", Monto=200m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Julio", Monto=250m},
            new Amortizacion {Fecha=Convert.ToDateTime("20/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=2, Ngrupo="CreaB", Npersona="Marcela", Monto=300m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=3, Ngrupo="Pedro", Npersona="Pedro", Monto=150m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=4, Ngrupo="CBI", Npersona="Juan", Monto=400m},
            new Amortizacion {Fecha=Convert.ToDateTime("21/01/2012"), Idbanco=1, Nbanco="Bancomer", Idgrupo=4, Ngrupo="CBI", Npersona="Manuel", Monto=450m},
            new Amortizacion {Fecha=Convert.ToDateTime("22/01/2012"), Idbanco=2, Nbanco="Afirme", Idgrupo=5, Ngrupo="Pepe", Npersona="Pepe", Monto=300m},
        };

И я определил свой класс следующим образом:

class Amortizacion
{
    public DateTime Fecha { get; set; }
    public int Idgrupo { get; set; }
    public string Ngrupo { get; set; }
    public int Idbanco { get; set; }
    public string Nbanco { get; set; }
    public string Npersona { get; set; }
    public decimal Monto { get; set; }
}

И я хочу создать вложенный групповой элемент для отображения его вдревовидное управление.Сначала мне нужно сгруппироваться по Фече, затем по Идбанко и, наконец, по Идгрупо.Результат, который я ищу, выглядит примерно так:

  • 20/01/2012 (4) acreditados
    • Bancomer
      • Jorge 500
    • Подтверждение
      • CreaB 750
        • Ное 200
        • Хулио 250
        • Марсела 300
  • 21/01/2012 (3) acreditados
    • Bancomer
      • Pedro 150
      • CBI 850
        • Хуан 400
        • Мануэль 450
  • 22/01/2012 (1) acreditados
    • Afirme
      • Pepe 300

Обратите внимание, что в узлах 'Fecha' число в скобках - это количество полей, сгруппированных по:и в узлах 'Idgrupo' отображаемая сумма представляет собой сумму отдельных 'Monto'.

Я до сих пор кодировал

var gpoFecha = lista.GroupBy(g => g.Fecha);
        int ifecha = 0;
        foreach (var fecha in gpoFecha)
        {
            TreeNode nodoFecha = new TreeNode(fecha.Key.ToString());
            treeAm.Nodes.Add(nodoFecha);
            var gpoBanco = fecha.GroupBy(gp => gp.Idbanco);
            foreach (var banco in gpoBanco)
            {
                int ibanco = 0;
                TreeNode nodoBanco = new TreeNode(banco.Key.ToString());
                treeAm.Nodes[ifecha].Nodes.Add(nodoBanco);
                var gpoGrpo = banco.GroupBy(gpo => gpo.Idgrupo);
                foreach (var cred in gpoGrpo)
                {
                    TreeNode nodoCred = new TreeNode(cred.Key.ToString());
                    treeAm.Nodes[ifecha].Nodes[ibanco].Nodes.Add(nodoCred);
                }
                ibanco++;
            }
            ifecha++;
        }

Проблема в том, что мой код не работает, как ожидалось,Другая проблема состоит в том, что я не знаю, как показать в своем узле дерева не только ключ, но и строку, которая определяет этот ключ (я имею в виду, что IdBanco = 1 должен показывать Nbanco = "Bancomer", как я показываю выше.).

Еще один интересный вопрос: это самый эффективный способ сделать это?Спасибо

1 Ответ

3 голосов
/ 20 января 2012
var query = from l in lista
            group l by l.Fecha into fetchaGroup
            select new
            {
                Fecha = fetchaGroup.Key,
                Count = fetchaGroup.Count()
                ,FetchaGroup = (from fg in fetchaGroup
                                   group fg by fg.Nbanco into NbancoGroup
                                   select new
                                   {
                                       Nbanco = NbancoGroup.Key,
                                       NbancoGroup = (from ng in NbancoGroup
                                                      group ng by ng.Ngrupo into NgrupoGroup
                                                      select new { Ngrupo = NgrupoGroup.Key, NgrupoGroup }
                                                    )
                                   }
                                )
            }
            ;


foreach (var g in query)
{
    Console.WriteLine("{0} ({1})", g.Fecha, g.Count);

    foreach (var fg in g.FetchaGroup)
    {
        Console.WriteLine("\t{0}", fg.Nbanco);

        foreach (var ng in fg.NbancoGroup)
        {
            Console.WriteLine("\t\t{0} {1}", ng.Ngrupo, ng.NgrupoGroup.Sum(ngg => ngg.Monto));

            if (ng.NgrupoGroup.Count() > 1)
            {
                foreach (var ngg in ng.NgrupoGroup)
                {
                    Console.WriteLine("\t\t\t{0} {1}", ngg.Npersona, ngg.Monto);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...