zoukankan      html  css  js  c++  java
  • C# 树形菜单的相关实现

    在一些涉及到组织架构的场景, 比如ERP, OA系统中我们经常会需要用到树的结构。自己开发的时候也遇到了此使用场景,总结一下以后就可以直接拿来用了。

     表设计如下:

     代码如下:        

            public class Node
            {
                public int NodeId { get; set; }      //节点Id
                public int ParentId { get; set; }   //节点父级Id 如果为0则为根节点
                public string NodeName { get; set; }   //节点名
                public DateTime WriteTime { get; set; }  // 备注
            }
    
            public class TreeNode
            {
                public int NodeId { get; set; }      //节点Id
                public int ParentId { get; set; }   //节点父级Id 如果为0则为根节点
                public string NodeName { get; set; }   //节点名
                public DateTime WriteTime { get; set; }  //写入时间
                public List<TreeNode> Children { get; set; }//子节点树
            }        
            
            /// <summary>
            /// 获取当前系统的结构树,可能多个树
            /// </summary>
            /// <returns></returns>
            public List<TreeNode> GetSysNodeTree()
            {
                using (MySqlHelper mySqlHelper = new MySqlHelper("MySqlTestDB"))
                {
                    List<TreeNode> treeNodeList = new List<TreeNode>();
                    //这一步数据库查询所有的记录 (避免递归中多次查询数据库)
                    List<Node> allNode = mySqlHelper.GetList_ExecuteSql<Node>("select * from tb_node");
    
                    //遍历所有的根节点
                    var rootList = allNode.Where(s => s.ParentId == 0).ToList();
                    foreach (var ent in rootList)
                    {
                        TreeNode treeNode = new TreeNode();
                        treeNode.NodeId = ent.NodeId;
                        treeNode.NodeName = ent.NodeName;
                        treeNode.ParentId = ent.ParentId;
                        treeNode.Children = GetChildrenTree(ent.NodeId, allNode);
                        treeNodeList.Add(treeNode);
                    }
    
                    return treeNodeList;
                }
            }
    
            /// <summary>
            /// 获取当前节点的节点树
            /// </summary>
            /// <param name="curNodeId"></param>
            /// <param name="allNode"></param>
            /// <returns></returns>
            public List<TreeNode> GetChildrenTree(int curNodeId, List<Node> allNode)
            {
                if (allNode == null || allNode.Count <= 0)
                    return new List<TreeNode>();
    
                List<TreeNode> TreeList = new List<TreeNode>();
                List<Node> children = allNode.Where(s => s.ParentId == curNodeId).ToList();
                foreach (var ent in children)
                {
                    TreeNode treeNode = new TreeNode();
                    treeNode.NodeId = ent.NodeId;
                    treeNode.NodeName = ent.NodeName;
                    treeNode.ParentId = ent.ParentId;
                    treeNode.Children = GetChildrenTree(ent.NodeId, allNode);
                    TreeList.Add(treeNode);
                }
    
                return TreeList;
            }
    
            /// <summary>
            /// 通过curNodeId 获取自己以及递归下的所有子Node (用于删除功能等)
            /// </summary>
            /// <param name="curNodeId"></param>
            /// <param name="allNode"></param>
            /// <returns></returns>
            public List<Node> GetRecurNodes(int curNodeId, List<Node> allNode)
            {
                if (curNodeId <= 0 || allNode==null)
                {
                    return null;
                }
                List<Node> list = new List<Node>();
                if (allNode.FirstOrDefault((m=>m.NodeId==curNodeId))!=null)
                    list.Add(allNode.FirstOrDefault((m => m.NodeId == curNodeId)));
                List<Node> firstLevelNodes = allNode.Where(m => m.ParentId == curNodeId).ToList();
                foreach (var node in firstLevelNodes)
                {
                    list.AddRange(GetRecurNodes(node.NodeId, allNode));
                }
    
                return list;
            }             

    然后前端拿到数据,同样递归展示就OK了。

    转载注明出处-祥子

  • 相关阅读:
    MYSQL: MYSQLBINLOG命令查看日志文件
    JAVA MAIL 发送邮件(SSL加密方式,TSL加密方式)
    Spring和Email整合详解
    java 版百度网盘功能
    Spring @Conditional注解 详细讲解及示例
    spring注解之@Import注解的三种使用方式(转载)
    Redis protected-mode属性解读
    5
    4
    3
  • 原文地址:https://www.cnblogs.com/stephenzengx/p/13690345.html
Copyright © 2011-2022 走看看