该功能最终实现的目标如下图所示:
其中菜单的数据来源于数据库,用于实现菜单数据的动态加载和管理。如上图所示,菜单最多时共有四级。
为实现上述功能,本人将数据库的表结构设计如下,如图所示:
表设计完成后,本人采取以下方法来实现上述功能,代码参照以下:
前台代码:
1 <div>
2 <asp:TreeView ID="TreeView1" runat="server">
3 </asp:TreeView>
4 </div>
2 <asp:TreeView ID="TreeView1" runat="server">
3 </asp:TreeView>
4 </div>
后台代码为:
首先实现加载所有根节点:
1 SqlConnection conn = null;
2 DataTable dtParent = null;
3 DataTable dtChild = null;
4
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 LoadMainTree();
8 }
9
10 protected void LoadMainTree()
11 {
12 //页面加载时清空
13 this.TreeView1.Nodes.Clear();
14
15 //从数据库表中查询树节点
16 //连接数据库
17 SqlConn();
18 conn.Open();
19
20 //返回查询结果集DataTable
21 dtParent=SelectTreeNodes("select * from MainMenu");
22
23 if (dtParent != null && dtParent.Rows.Count > 0)
24 {
25 foreach (DataRow row in dtParent.Rows)
26 {
27 TreeNode node = new TreeNode();
28 node.Text=row["TreeName"].ToString();
29 node.Value = row["ID"].ToString();
30 node.Expanded = true;
31 TreeView1.Nodes.Add(node);
32
33 //返回查询结果集,查询所有子菜单内容,将查询结果保存至DataTable中
34 dtChild = SelectTreeNodes("select * from MenuContent where MainID='" + node.Value + "'");
35 //追加子树节点
36 AddChildNodes(node, row["ID"].ToString(),0); //, dt.Rows[0]["nodeOrder"].ToString()
37 }
38 }
39
40 conn.Close();
41 }
2 DataTable dtParent = null;
3 DataTable dtChild = null;
4
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 LoadMainTree();
8 }
9
10 protected void LoadMainTree()
11 {
12 //页面加载时清空
13 this.TreeView1.Nodes.Clear();
14
15 //从数据库表中查询树节点
16 //连接数据库
17 SqlConn();
18 conn.Open();
19
20 //返回查询结果集DataTable
21 dtParent=SelectTreeNodes("select * from MainMenu");
22
23 if (dtParent != null && dtParent.Rows.Count > 0)
24 {
25 foreach (DataRow row in dtParent.Rows)
26 {
27 TreeNode node = new TreeNode();
28 node.Text=row["TreeName"].ToString();
29 node.Value = row["ID"].ToString();
30 node.Expanded = true;
31 TreeView1.Nodes.Add(node);
32
33 //返回查询结果集,查询所有子菜单内容,将查询结果保存至DataTable中
34 dtChild = SelectTreeNodes("select * from MenuContent where MainID='" + node.Value + "'");
35 //追加子树节点
36 AddChildNodes(node, row["ID"].ToString(),0); //, dt.Rows[0]["nodeOrder"].ToString()
37 }
38 }
39
40 conn.Close();
41 }
其中,函数AddChildNodes(node, row["ID"].ToString(),0); 用于加载所有的子菜单节点,参数node表示当前节点,参数row["ID"].ToString()用于传递当前节点的ID值,用于查询子节点的父节点,参数0表示当前为根节点。
AddChildNodes()定义如下:


1 protected void AddChildNodes(TreeNode node,string mainId,int parentID)
2 {
3 //筛选MainID等于mainId的所有菜单项
4 DataView dataView = new DataView(dtChild, "MainID='" + mainId + "' and ParentNodeId='" + parentID + "'", "NodeOrder", DataViewRowState.CurrentRows);
5
6 foreach (DataRowView row in dataView)
7 {
8 TreeNode childNode = new TreeNode();
9 childNode.Text = row["TreeName"].ToString();
10 childNode.Value = row["ID"].ToString();
11
12 node.Expanded = true;
13 node.ChildNodes.Add(childNode);
14
15 AddChildNodes(childNode,row["MainID"].ToString(),int.Parse(row["ID"].ToString()));
16 }
17 }
2 {
3 //筛选MainID等于mainId的所有菜单项
4 DataView dataView = new DataView(dtChild, "MainID='" + mainId + "' and ParentNodeId='" + parentID + "'", "NodeOrder", DataViewRowState.CurrentRows);
5
6 foreach (DataRowView row in dataView)
7 {
8 TreeNode childNode = new TreeNode();
9 childNode.Text = row["TreeName"].ToString();
10 childNode.Value = row["ID"].ToString();
11
12 node.Expanded = true;
13 node.ChildNodes.Add(childNode);
14
15 AddChildNodes(childNode,row["MainID"].ToString(),int.Parse(row["ID"].ToString()));
16 }
17 }
以上部分为实现上述功能的代码,表结构和代码实现方式上可能还有很多不成熟之处。
如有哪位热心的高手指点或指正一下,小弟将感激不尽~,谢谢。