树形结构在开发中的应用
撰文: 李洪根
本文首发于《CSDN开发高手》2003年第十二期
概述
树形结构的展示方式
数据库设计
列名
|
数据类型
|
描述
|
长度
|
主键
|
ID
|
Int
|
节点编号
|
4
|
是
|
ConText
|
Nvarchar
|
我们要显示的节点内容
|
50
|
|
ParentID
|
Int
|
父节点编号
|
4
|
|
Depth
|
Int
|
深度
|
4
|
|
CREATE TABLE [dbo].[tbTree] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Context] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ParentID] [int] NULL
) ON [PRIMARY]
SET IDENTITY_INSERT tbtree ON
insert tbtree (ID,Context,ParentID) values ( 1,'中国',0)
insert tbtree (ID,Context,ParentID) values ( 2,'北京',11)
insert tbtree (ID,Context,ParentID) values ( 3,'天津',1)
insert tbtree (ID,Context,ParentID) values ( 4,'河北省',1)
insert tbtree (ID,Context,ParentID) values ( 5,'广东省',1)
insert tbtree (ID,Context,ParentID) values ( 6,'广州',5)
insert tbtree (ID,Context,ParentID) values ( 7,'四川省',1)
insert tbtree (ID,Context,ParentID) values ( 8,'成都',7)
insert tbtree (ID,Context,ParentID) values ( 9,'深圳',5)
insert tbtree (ID,Context,ParentID) values ( 10,'石家庄',4)
insert tbtree (ID,Context,ParentID) values ( 11,'辽宁省',1)
insert tbtree (ID,Context,ParentID) values ( 12,'大连',11)
insert tbtree (ID,Context,ParentID) values ( 13,'上海',1)
insert tbtree (ID,Context,ParentID) values ( 14,'天河软件园',6)
insert tbtree (ID,Context,ParentID) values ( 15,'汕头',5)
SET IDENTITY_INSERT tbtree off
在C# 中实现:
.NET使用递归填充TreeView
文章分类:.net编程最近在做一个信息管理系统的后台,打算用树型结构显示导航列表,用一般的遍历实现不了这样无限级别的导航,所以使用递归.
一.数据库表结构大致是这样:
ID Name(导航名) ParentID(对应父级)
1 后台管理 0
2 人员管理 1
3 系统人员 2
4 员工管理 3
5 单位管理 1
6 基础资料 0
7 客户管理 6
8 商品管理 6
……
还有很多属性,这里就不列举出来了,在日后将推出权限方面的文章再提及其他属性,为了思路清晰,实现树绑定仅这些列足够.
预期效果:
- 后台管理
- 人员管理
系统人员
员工管理
- 单位管理
- 基础资料
- 客户管理
- 商品管理
(针对列举的数据只有3层,我们要做的是无限级别)
二.初期准备:新建Asp.net页面,从导航控件盒拖入TreeView控件
三.思路:
遍历找出没有父级的节点A,如果有下级节点则将下级节点B添加到A的子集,如果B也拥有下级节点C,则将C添加到B的子集,……从这规律我们可以推导出需要遍历的地方以及参数包括 当前节点ID,当前节点实体.以下是代码:
- //得到导航列表
- private List<Model.Sys_Navigation> NavList = new BLL.Sys_Navigation().GetList();
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- //执行绑定
- CreateTree();
- }
- }
- #region 递归绑定树控件
- private void CreateTree()
- {
- foreach (Model.Sys_Navigation model in NavList.Where(p => p.ParentID == 0))
- {
- TreeNode ParentNode = new TreeNode(model.Name, model.ID.ToString());
- TreeView1.Nodes.Add(ParentNode);
- GetChildNodes(ParentNode);
- }
- }
- private void GetChildNodes(TreeNode ParentNode)
- {
- foreach (Model.Sys_Navigation model in NavList.Where(p => p.ParentID == MyConvert.toInt32(ParentNode.Value)))
- {
- TreeNode ChildNode = new TreeNode(model.Name, model.ID.ToString());
- if (NavList.Exists(p => p.ParentID == model.ID)) GetChildNodes(ChildNode);
- ParentNode.ChildNodes.Add(ChildNode);
- }
- }
- #endregion