zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Tree 菜单 递归

递归 菜单 Tree
2023-09-11 14:21:23 时间

转载:http://www.cnblogs.com/igoogleyou/archive/2012/12/17/treeview2.html

 

一,通过查询数据库的方法

 

ID 为主键,PID 表明数据之间的关系。

 

/// <summary>
/// 生产树的代码;
/// </summary>
/// <param name="node"> 根节点</param>
/// <param name="id">主键</param>
 
        private void CreateTwo(TreeNode node, int id)
        {
            string strSql = "select * from TableTest where PID = " + id;
            DataTable dt = SqlClass.GetTable(strSql);
            if (id == 0)                                  // id = 0 是根节点 
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TreeNode nd = new TreeNode();
                    nd.Text = dt.Rows[i]["Name"].ToString();
                    CreateTwo(nd, Convert.ToInt32(dt.Rows[i]["id"].ToString()));
                    tvwTwo.Nodes.Add(nd);
                }
            }
            else
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TreeNode Tnode = new TreeNode();
                    Tnode.Text = dt.Rows[i]["Name"].ToString();
                    CreateTwo(Tnode, Convert.ToInt32(dt.Rows[i]["id"].ToString()));
                    node.Nodes.Add(Tnode);
                }
            }
        }

 


 
 
则个代码比较简单 只需要查询一个数据表。
不过会查询多次,我觉得不合适。
所以第二个方法,全部拿出来,在缓存里操作。

 

 

 

生成结果:

 

-------------------------------------------------------------------------------------------------------------------------------

 

二,通过linq 获取菜单的通用方法:

 

static void Main(string[] args)
        {
            //最终结果
            UserR ur = new UserR();
            //调用
            Create(ur, 0);
            //打印
            Print(ur);
            string str = JsonConvert.SerializeObject(ur);
            Console.ReadLine();
        }
        //测试数据
        static List<User> list = new List<User>()
            {
                new User(){id=1,name="food",parentId=0},
                new User(){id=2,name="fruit",parentId=1},
                new User(){id=3,name="red",parentId=2},
                new User(){id=4,name="cherry",parentId=3},
                new User(){id=5,name="yellow",parentId=2},
                new User(){id=6,name="banana",parentId=5},
                new User(){id=7,name="meat",parentId=1},
                new User(){id=8,name="beef",parentId=7},
                new User(){id=9,name="pork",parentId=7},
            };

        

        //递归遍历
        private static void Create(UserR node, int id)
        {
            var q = list.Where(x => x.parentId == id).ToList();
            for (int i = 0; i < q.Count; i++)
                {
                    UserR nd = new UserR();
                    nd.id = q[i].id;
                    nd.name = q[i].name;
                    Create(nd, q[i].id);
                    node.u.Add(nd);
                }
            
        }

        //打印查看结果
        static void Print(UserR ur)
        {
            Console.WriteLine(ur.name);
            if (ur.u != null)
                foreach (var item in ur.u)
                {
                    Print(item);
                }
        }

        //查询出的实体层
        public class User
        {
            public int id { get; set; }
            public string name { get; set; }
            public int parentId { get; set; }
        }
        //遍历后的实体层
        public class UserR
        {
            public int id { get; set; }
            public string name { get; set; }
            public List<UserR> u = new List<UserR>();
            public int parentId { get; set; }
        }