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); } } } }