private void f_PopulateTreeGroup(Cl_Group.E_Type a_Type, Cl_Group a_Group, TreeNodeCollection a_TreeNodes)
 {
     if (p_ActiveTemplate != null)
     {
         TreeNode node = new Ctrl_TreeNodeGroup(a_Group);
         a_TreeNodes.Add(node);
         if (a_Type == Cl_Group.E_Type.Elements)
         {
             var els = Cl_App.m_DataContext.p_Elements
                       .Where(e => e.p_ParentGroupID == a_Group.p_ID && !e.p_IsDelete && e.p_Version > 0).GroupBy(e => e.p_ElementID)
                       .Select(grp => grp
                               .OrderByDescending(v => v.p_Version).FirstOrDefault())
                       .Include(e => e.p_ParamsValues);
             foreach (Cl_Element el in els)
             {
                 node.Nodes.Add(new Ctrl_TreeNodeElement(a_Group, el));
             }
         }
         else if (p_ActiveTemplate.p_Type == Cl_Template.E_TemplateType.Template)
         {
             var tpls = Cl_App.m_DataContext.p_Templates.Include(t => t.p_TemplateElements)
                        .Where(e => e.p_ParentGroupID == a_Group.p_ID && !e.p_IsDelete && (e.p_Type == Cl_Template.E_TemplateType.Block || e.p_Type == Cl_Template.E_TemplateType.Table)).GroupBy(e => e.p_TemplateID)
                        .Select(grp => grp
                                .OrderByDescending(v => v.p_Version).FirstOrDefault());
             foreach (Cl_Template tpl in tpls)
             {
                 node.Nodes.Add(new Ctrl_TreeNodeTemplate(a_Group, tpl));
             }
         }
         var dcGroups = Cl_App.m_DataContext.Entry(a_Group).Collection(g => g.p_SubGroups);
         if (!dcGroups.IsLoaded)
         {
             dcGroups.Load();
         }
         foreach (Cl_Group group in a_Group.p_SubGroups)
         {
             if (!group.p_IsDelete)
             {
                 f_PopulateTreeGroup(a_Type, group, node.Nodes);
             }
         }
     }
 }