c# 遞歸樹形菜單


首先創建模型類Menus

public class Menus
{
    //菜單Id
    public int Id { get; set; }
    //菜單名
    public string MenuName { get; set; }
    //父節點Id
    public int ParentId { get; set; }
}

窗體中放入button跟TreeView控件

聲明全局變量

private static List<Menus> menus;

添加按鈕事件

private void button1_Click(object sender, EventArgs e)
{
    menus = new List<Menus>();
    menus.Add(new Menus { Id = 1, MenuName = "基礎設置", ParentId = 0 });
    menus.Add(new Menus { Id = 2, MenuName = "采購管理", ParentId = 0 });
    menus.Add(new Menus { Id = 3, MenuName = "系統設置", ParentId = 1 });
    menus.Add(new Menus { Id = 4, MenuName = "用戶管理", ParentId = 1 });
    menus.Add(new Menus { Id = 5, MenuName = "采購訂單", ParentId = 2 });
    menus.Add(new Menus { Id = 6, MenuName = "采購入庫", ParentId = 2 });
    menus.Add(new Menus { Id = 7, MenuName = "用戶", ParentId = 4 });
    menus.Add(new Menus { Id = 8, MenuName = "采購退貨", ParentId = 2 });
    menus.Add(new Menus { Id = 9, MenuName = "用戶組", ParentId = 4 });
    menus.Add(new Menus { Id = 10, MenuName = "權限管理", ParentId = 4 });
    
    //首先查出頂級菜單,循環添加
    IEnumerable<Menus> menu = from m in menus where m.ParentId == 0 orderby m.ParentId select m;

    foreach (var item in menu)
    {
        TreeNode node = new TreeNode();
        node.Tag = item;
        node.Text = item.MenuName;
        treeView1.Nodes.Add(node);
        //將當前節點作為參數傳入子節點
        AddChildMenu(node);
    }

}

子節點遞歸實現

private void AddChildMenu(TreeNode node)
{
    Menus menu = new Menus();
    menu = (Menus)node.Tag;   //將父節點轉為Model
    //查出當前子節點中所有同父節點Id一樣的數據
    IEnumerable<Menus> childMenu = from m in menus where m.ParentId == menu.Id orderby m.Id select m;
    foreach (var item in childMenu)
    {
        TreeNode childNode = new TreeNode();
        childNode.Tag = item;
        childNode.Text = item.MenuName;
        node.Nodes.Add(childNode);  //添加子節點
        AddChildMenu(childNode);    //遞歸調用自己,直到父節點添加所有子節點結束
    }
}

效果展示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM