//向树中增加叶子 private void FindLeafAddToNode(IRAPTreeNodes root, List <TreeLeafEntity> leafSet) { if (leafSet == null) { return; } var subLeaves = leafSet.Where(c => c.Father == root.NodeID).ToList(); if (root.Children == null) { root.Children = new List <IRAPTreeNodes>(); } foreach (var r in subLeaves) { // exists = true; IRAPTreeNodes node = new IRAPTreeNodes(); node.NodeID = -r.LeafID; node.NodeCode = r.Code; node.NodeName = r.NodeName; node.NodeDepth = r.NodeDepth; node.NodeStatus = 0; node.NodeType = 4; node.CSTRoot = r.CSTRoot; node.UDFOrdinal = r.UDFOrdinal; node.TreeViewType = 2; node.Parent = r.Father; node.IconFile = r.IconID.ToString(); node.FatherNode = root; node.Accessibility = 0; node.AlternateCode = r.AlternateCode; root.Children.Add(node); } }
//向树中增加节点 private void FindNodeAddToNode(IRAPTreeNodes root, List <TreeNodeEntity> nodeSet, List <TreeLeafEntity> leafSet) { var subList = nodeSet.Where(c => c.Father == root.NodeID).ToList(); //bool exists = false; root.Children = new List <IRAPTreeNodes>(); FindLeafAddToNode(root, leafSet); foreach (var r in subList) { // exists = true; IRAPTreeNodes node = new IRAPTreeNodes(); node.NodeID = r.NodeID; node.NodeCode = r.Code; node.NodeName = r.NodeName; node.NodeDepth = r.NodeDepth; node.NodeStatus = r.NodeStatus; node.NodeType = 3; node.CSTRoot = r.CSTRoot; node.UDFOrdinal = r.UDFOrdinal; node.TreeViewType = 2; node.Parent = r.Father; node.IconFile = r.IconID.ToString(); node.FatherNode = root; node.Accessibility = 0; node.AlternateCode = ""; root.Children.Add(node); FindNodeAddToNode(node, nodeSet, leafSet); } }
//权限向上追溯 private void UpTree(IRAPTreeNodes fatherNode) { if (fatherNode == null) { return; } if (fatherNode.Accessibility != 1) { fatherNode.Accessibility = 1; } UpTree(fatherNode.FatherNode); }
//动态创建泛型实例举例 //public void Test() //{ // Type type = Type.GetType("IRAPBase.Entities.ERS_T1R1", true, true); // var repositoryType = typeof(Repository<>); // // IRepository test; // var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(type), context); // Console.WriteLine(type.FullName); //} /// <summary> /// 返回树的数据,支持懒加载 /// </summary> /// <returns></returns> private IRAPTreeNodes TreeViewData(int entryNode = 0, bool includingLeaves = true) { //long[] pkArray = { PK + _treeID, _treeID }; int errCode = 0; string errText = "获取成功!"; List <TreeNodeEntity> newNodelist = nodes.Where(r => r.TreeID == _treeID && _PKDict.Contains(r.PartitioningKey)).OrderBy(r => r.NodeDepth).ThenBy(r => r.NodeID).ToList(); List <TreeNodeEntity> nodeSet = new List <TreeNodeEntity>(); if (entryNode > 0) { TreeNodeEntity thisNode = newNodelist.FirstOrDefault(c => c.NodeID == entryNode); if (thisNode == null) { errCode = 2; errText = "入口结点无效!"; throw new Exception($"{errCode}-{errText}"); } nodeSet = newNodelist.Where(c => c.NodeDepth > thisNode.NodeDepth).OrderBy(r => r.NodeDepth).ThenBy(r => r.NodeID).ToList(); nodeSet.Insert(0, thisNode); } else { nodeSet = newNodelist; } List <TreeLeafEntity> leafSet = null; if (includingLeaves) { leafSet = leaves.Where(r => r.TreeID == _treeID && _PKDict.Contains(r.PartitioningKey)).OrderBy(r => r.UDFOrdinal).Take(50000).ToList(); } TreeNodeEntity node = nodeSet.FirstOrDefault(); IRAPTreeNodes rootNode = new IRAPTreeNodes(); if (node != null) { rootNode.NodeID = node.NodeID; rootNode.NodeCode = node.Code; rootNode.NodeName = node.NodeName; rootNode.NodeDepth = node.NodeDepth; rootNode.NodeStatus = node.NodeStatus; rootNode.NodeType = 3; rootNode.CSTRoot = node.CSTRoot; rootNode.UDFOrdinal = node.UDFOrdinal; rootNode.TreeViewType = 2; rootNode.Parent = node.Father; rootNode.IconFile = node.IconID.ToString(); rootNode.Accessibility = 0; FindNodeAddToNode(rootNode, nodeSet, leafSet); } return(rootNode); }
//权限向下追溯 private void DownTree(IRAPTreeNodes rootNode, List <EGrant> grantList) { //Console.WriteLine("根节点:{0}-{1}", rootNode.NodeID, rootNode.NodeName); if (rootNode.FatherNode == null) { if (grantList.Any(c => c.CSTRoot == rootNode.CSTRoot)) { rootNode.Accessibility = 1; accessibleNodes.Add(rootNode); } } if (rootNode.Children == null) { //if (grantList.Any(c => c.CSTRoot == rootNode.CSTRoot)) //{ // rootNode.Accessibility = 1; // accessibleNodes.Add(rootNode); //} return; } bool subAccessible = false; if (rootNode.Accessibility == 1) { subAccessible = true; accessibleNodes.Add(rootNode); } foreach (var r in rootNode.Children) { if (subAccessible) { r.Accessibility = 1; } else { if (grantList.Any(c => c.CSTRoot == r.CSTRoot)) { r.Accessibility = 1; } } DownTree(r, grantList); if (r.Accessibility == 1) { accessibleNodes.Add(r); } } }
/// <summary> /// 获取树视图(带权限) /// </summary> /// <param name="agencyNode">机构标识(仅支持叶子)</param> /// <param name="roleNode">角色标识(</param> /// <returns></returns> public List <TreeViewDTO> AccessibleTreeView(int agencyNode, int roleNode) { IRAPGrant grant = new IRAPGrant(_communityID); accessibleNodes.Clear(); List <EGrant> list = grant.GetGrantListByTree(_treeID, agencyNode, roleNode); IRAPTreeNodes rootTree = TreeViewData(); DownTree(rootTree, list); foreach (var node in accessibleNodes) { UpTree(node); } //去掉不可访问的结点 RemoveNoAccessible(rootTree); return(GetPlainTreeData(rootTree)); }
//移除看不到的树节点 private void RemoveNoAccessible(IRAPTreeNodes rootNode) { //Console.WriteLine("根节点:{0}-{1}", rootNode.NodeID, rootNode.NodeName); if (rootNode.Children == null || rootNode.Children.Count == 0) { return; } var list = rootNode.Children; //var q = from c in list.ToArray() where c.Accessibility == 0 select c; //foreach (var ei in q) //{ // list.Remove(ei); //删除了 // Console.WriteLine("节点{0}无权访问已删除!", ei.NodeID); //} list.RemoveAll(s => s.Accessibility == 0); var q2 = from c in list where c.Accessibility == 1 select c; foreach (var ei in q2) { RemoveNoAccessible(ei); } }
private List <TreeViewDTO> GetPlainTreeData(IRAPTreeNodes rootNode) { List <TreeViewDTO> rows = new List <TreeViewDTO>(); TreeViewDTO item = new TreeViewDTO() { Accessibility = rootNode.Accessibility, CSTRoot = rootNode.CSTRoot, HelpMemoryCode = rootNode.HelpMemoryCode, IconFile = rootNode.IconFile, IconImage = rootNode.IconImage, NodeCode = rootNode.NodeCode, AlternateCode = rootNode.AlternateCode, NodeDepth = rootNode.NodeDepth, NodeID = rootNode.NodeID, NodeName = rootNode.NodeName, NodeStatus = rootNode.NodeStatus, NodeType = rootNode.NodeType, Parent = rootNode.Parent, SearchCode1 = rootNode.SearchCode1, SearchCode2 = rootNode.SearchCode2, SelectStatus = rootNode.SelectStatus, TreeViewType = rootNode.TreeViewType, UDFOrdinal = rootNode.UDFOrdinal }; rows.Add(item); if (rootNode.Children == null) { return(rows); } //if (rootNode.FatherNode == null) //{ // Console.WriteLine("{0}[{1}]", rootNode.NodeName, rootNode.NodeID); //} foreach (var r in rootNode.Children) { // Console.WriteLine(new string('-', r.NodeDepth * 2) + (r.NodeID < 0 ? "-" : "+") + "{0}[{1}] ", r.NodeName, r.NodeID); List <TreeViewDTO> list = GetPlainTreeData(r); foreach (TreeViewDTO c in list) { TreeViewDTO item2 = new TreeViewDTO() { Accessibility = c.Accessibility, CSTRoot = c.CSTRoot, HelpMemoryCode = c.HelpMemoryCode, IconFile = c.IconFile, IconImage = c.IconImage, NodeCode = c.NodeCode, AlternateCode = c.AlternateCode, NodeDepth = c.NodeDepth, NodeID = c.NodeID, NodeName = c.NodeName, NodeStatus = c.NodeStatus, NodeType = c.NodeType, Parent = c.Parent, SearchCode1 = c.SearchCode1, SearchCode2 = c.SearchCode2, SelectStatus = c.SelectStatus, TreeViewType = c.TreeViewType, UDFOrdinal = c.UDFOrdinal }; rows.Add(c); } } return(rows); }