Winform---代碼實現遞歸動態生成TreeView菜單


數據庫菜單表:

SQL腳本:

 1 use master
 2 go
 3 
 4 create database TreeViewDemo
 5 on primary
 6 (
 7     name='TreeViewDemo_data',
 8     filename='C:\2Study\SQLServer\TreeViewDemo\TreeViewDemo_data.mdf',
 9     size=5MB,
10     filegrowth=1MB
11 )
12 
13 create table MenuList
14 (
15     MenuId int identity(1,1) primary key,
16     MenuName varchar(20) ,--菜單名稱
17     MenuCode varchar(20),--菜單編號
18     ParentId int --父類編號
19 )
20 
21 --一級菜單
22 insert into MenuList (MenuName, MenuCode, ParentId) values ('系統管理','',0)--1
23 insert into MenuList (MenuName, MenuCode, ParentId) values ('學員管理','',0)--2
24 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績管理','',0)--3
25 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤管理','',0)--4
26 insert into MenuList (MenuName, MenuCode, ParentId) values ('系統幫助','Help',0)--5
27 
28 --二級菜單
29 insert into MenuList (MenuName, MenuCode, ParentId) values ('密碼修改','ModifyPwd',1)
30 
31 insert into MenuList (MenuName, MenuCode, ParentId) values ('添加學員','AddStu',2)
32 insert into MenuList (MenuName, MenuCode, ParentId) values ('批量導入學員','ImportStu',2)
33 insert into MenuList (MenuName, MenuCode, ParentId) values ('學員信息管理','StuManage',2)
34 
35 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績查詢與分析','ScoreQuery',3)
36 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績快速查詢','ScoreQuickQuery',3)
37 
38 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤打卡','ModifyPwd',4)
39 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤查詢','ModifyPwd',4)
40 
41 select * from MenuList
View Code

相關表測試數據:

相關實體類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TreeViewDemo
{
    public class TVNode
    {        
        public int MenuId { get; set; }
        public string MenuName { get; set; }
        public string MenuCode { get; set; }
        public int ParentId { get; set; }

    }
}
View Code

數據庫查詢(簡易版):

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data.SqlClient;
 7 
 8 namespace TreeViewDemo
 9 {
10     public class SQLHelper
11     {
12         public List<TVNode> GetMenuList()
13         {
14             string connString = "Server=.;DataBase=TreeViewDemo;Uid=sa;Pwd=warrenwell";
15             string sql = "select MenuId,MenuName, MenuCode, ParentId from MenuList";
16             List<TVNode> objMenuList = new List<TVNode>();
17             SqlConnection conn = new SqlConnection(connString);
18             SqlCommand cmd = new SqlCommand(sql,conn);
19             conn.Open();
20             SqlDataReader objReader = cmd.ExecuteReader();
21             while (objReader.Read())
22             {
23                 objMenuList.Add(new TVNode
24                 {
25                     MenuId=Convert.ToInt32(objReader["MenuId"]),
26                     MenuName=objReader["MenuName"].ToString(),
27                     MenuCode=objReader["MenuCode"].ToString(),
28                     ParentId= Convert.ToInt32(objReader["ParentId"])
29                 });
30             }
31             objReader.Close();
32             conn.Close();
33             return objMenuList;
34         }
35     }
36 }
View Code

TreeView遞歸實現:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 using System.Reflection;
11 
12 namespace TreeViewDemo
13 {
14     public partial class Form1 : Form
15     {
16         public Form1()
17         {
18             InitializeComponent();
19         }
20 
21         private void Form1_Load(object sender, EventArgs e)
22         {
23             this.nodeList = new SQLHelper().GetMenuList();
24 
25             //創建根節點
26             this.tv.Nodes.Clear();//清空節點
27             TreeNode rootNode = new TreeNode();
28             rootNode.Text = "學員管理系統";
29             rootNode.Tag = 0;
30             rootNode.ImageIndex = 0;
31             this.tv.Nodes.Add(rootNode);
32 
33             CreateChildNode(rootNode,0);
34 
35             //this.tv.Nodes[0].Expand();//展開一級菜單
36             this.tv.ExpandAll();//展開所有菜單
37         }
38 
39         private List<TVNode> nodeList = new List<TVNode>();
40         private void CreateChildNode(System.Windows.Forms.TreeNode parentNode,int parentId)
41         {
42             //找到該節點下的子項(父節點值等於該節點編號)
43             var nodes = from list in this.nodeList
44                        where list.ParentId.Equals(parentId)
45                        select list;
46             //創建該節點子節點
47             foreach (var item in nodes)
48             {
49                 TreeNode node = new TreeNode();
50                 node.Text = item.MenuName;
51                 node.Tag = item.MenuCode;
52 
53                 ////此處可根據節點的parentId來設置圖標
54                 if (item.ParentId == 0)
55                 {
56                     node.ImageIndex = 1;
57                 }
58                 else 
59                 {
60                     node.ImageIndex = 2;
61                 }
62                 //父節點添加子節點
63                 parentNode.Nodes.Add(node);
64                 //調用自身:遞歸
65                 CreateChildNode(node,item.MenuId);
66             }           
67         }
68        
69         private void tv_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
70         {
71             if (e.Node.Level == 2)
72             {
73                 Form obj = (Form)Assembly.Load("TreeViewDemo").CreateInstance("TreeViewDemo.Frm" + e.Node.Tag.ToString());
74                 obj.Show();
75             }
76         }
77 
78         private void tv_AfterExpand(object sender, TreeViewEventArgs e)
79         {
80             e.Node.ImageIndex = 0;
81         }
82 
83         private void tv_AfterCollapse(object sender, TreeViewEventArgs e)
84         {
85             e.Node.ImageIndex = 1;
86         }
87     }
88 }
View Code

 實現效果:

歡迎前來指教!

 


免責聲明!

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



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