var zNodes =[
        { "id":1, "pId":0, "name":"父节点1 - 展开", "open":false},
      /*  { id:11, pId:1, name:"父节点11 - 折叠"},
        { id:13, pId:1, name:"父节点13 - 没有子节点", isParent:true}*/,
        { "id":2, "pId":0, "name":"父节点2 - 折叠"},
      /*  { id:21, pId:2, name:"父节点21 - 展开", open:true},
        { id:3, pId:0, name:"父节点3 - 没有子节点", isParent:true}*/
    ];

起先 子节点跟父挂载不上,都是一个级别. 本想js  弱对大小写不敏感吧,混合了sql对大小写的 实际是误解.

后来发现传递过来的 pId  写成了 pid ....... 所以注意大小写.

2: 实体类 只需三个字段即可,加多了, 可能会点不开

    public class MenusItem
        {
            public int id { get; set; }
            public int pId { get; set; }
            public string name { get; set; }
            //public bool open { get; set; }
            //public bool isParent { get; set; }
        }

3: 不用在意  先后顺序, 只需要id 跟pid 对应好就可以,也无需id 从1开始, 只需把最顶级 的pid 设置为0即可. id 数据查询时可以对应到表id ,pid 对应上级 id

  { "id":1, "pId":0, "name":"父节点1 - 展开", "open":false},
      /*  { id:11, pId:1, name:"父节点11 - 折叠"},
        { id:13, pId:1, name:"父节点13 - 没有子节点", isParent:true}*/,
   { "id":2, "pId":0, "name":"父节点2 - 折叠"},

4:异步展示,在数据量较大时更为合适,也符合 点到加载,减少资源浪费.

 5: 这个其实顺序用不到递归啥的, 数据库一个left join  就可以拼出上边的格式. 得益于没有以上节点没有顺序要求.

 

 

父子递归  父子节点 改改即可 应用到 ztree  另一种非 id pid  name  方式的

public class  TestClass
{
    public List<MenuItem> Main = new List<MenuItem>();
    
    public void Enter() //入口
    {
        List<MenuItem> allMenu = GetAllMenus(); //得到数据 
        Main.Add(allMenu.Where(x => x.MenuID == 1).FirstOrDefault());//根节点
        AddMenu(allMenu, allMenu.Where(x => x.MenuID == 1).FirstOrDefault());//递归
        
        //结果树形结构
        List<MenuItem>  treeMenu = Main;
        
    }
    //父子级递归
    public void AddMenu(List<MenuItem> all, MenuItem curItem)
    {
        List<MenuItem> childItems = all.Where(ee => ee.ParentID == curItem.MenuID).ToList(); //得到子节点
        curItem.ChildItems = childItems; //将子节点加入
        
        //遍历子节点,进行递归,寻找子节点的子节点
        foreach (var subItem in childItems)
        {
            AddMenu(all, subItem);
        }
    }
    public List<MenuItem> GetAllMenus() 
    {
        List<MenuItem>() listMenuS = NEW List<MenuItem>();
        // 得到数据
        // 结构如下:
        //  MenuID  DisplayName  ParentID   ChildItems
        //    1        Name1        0                     根节点
        //    2        Name2        1
        //    3        Name3        1
        //    4        Name4        2
        //    5        Name5        2
        
        return listMenuS;
    }
    
}
 
 
//数据对象
public class MenuItem
{
    public int MenuID { get; set; }
    public string DisplayName { get; set; }
    public int ParentID { get; set; }
    public List<MenuItem> ChildItems { get; set; }
}

————————————————
版权声明:本文为CSDN博主「预立科技」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_16998945/article/details/78042901

 

posted on 2021-07-22 09:06  小石头的一天  阅读(258)  评论(0编辑  收藏  举报