加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

根据父子节点生成树

(2012-12-01 02:06:13)
标签:

杂谈

根据父子节点生成树
 
问题提出:做过协同办公(oa)系统的都知道,系统中有“部门模块”,在该模块有的部门是“顶级”部门,即没有上级部门,而有的部门有上级部门。在表示层里,如何直观表达出部门部门间这种“上级下级”间的关系呢?
当然,有人第一反应就是树,可惜啊,TreeView(vs 2005,asp.net,c sharp)是不能表达出这种关系的?
(问:为什么?)
(答:有本事你用TreeView试试)
数据库设计: 这类的数据库大家设计得都差不多,就不多说了,直接把结构列出,并insert几个数据。(zw_dept)
列名
类型
说明
Dept_id
int
Primary key
部门编号
Dept_name
Varchar(20)
部门名
Dept_man
其它信息
Dept_up
Int
上级部门ID
Dept_info
其它信息
Sc_id
其它信息
Insert数据后:
Dept_id
Dept_name
Dept_man
Dept_up
Dept_info
Sc_id
1
test
0(一定要有,like treeview)
2
test
1
3
test
2
4
test
0
5
test
2
6
test
1
7
test
0
8
test
6
9
test
2
10
test
3
11
test
10
12
test
2
13
test
2
14
test
1
运行结果如下图:
  
  在这可看出来:1,4,7是父节点。在父节点1下有子节点:2,6,14。
父节点4,7均无子节点。在2下有节点:3,5,9,12,13,8。
解题思路:
1.找到一父节点。
2.如果有子节点,则找到一子节点,如果没有返回1。
3.判断该子节点是否有子节点,没有就返回2;如果有就找到子节点。
4.递归调用以上3步。
代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using JFanAspx; //本人写的一个操作数据库的包
public partial class tableTest : System.Web.UI.Page
{
AdoNetCon anc = new AdoNetCon(); //实例化对象
DataSet ds = new DataSet(); //读数据库中间量
DataTable dts = new DataTable(); //从数据库里读出的数据保存在这里 
DataTable dt = new DataTable(); //临时变量,后显示的gridView从该变量得数据
ArrayList temp = new ArrayList(); //临时变量,用来保存一系统父节点
DataRow dr; //临时变量,从dts中读数据,修改保存到dt中
int j = 0;
int p = 0;
protected void Page_Load(object sender, EventArgs e)
{
//
DataColumn myDataColumn = new DataColumn();
dt.Columns.Add(myDataColumn);
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "列一";
DataColumn myDataColumn2 = new DataColumn();
dt.Columns.Add(myDataColumn2);
myDataColumn2.DataType = System.Type.GetType("System.String");
myDataColumn2.ColumnName = "列二";
DataColumn myDataColumn3 = new DataColumn();
dt.Columns.Add(myDataColumn3);
myDataColumn3.DataType = System.Type.GetType("System.String");
myDataColumn3.ColumnName = "列三";
DataColumn myDataColumn4 = new DataColumn();
dt.Columns.Add(myDataColumn4);
myDataColumn4.DataType = System.Type.GetType("System.String");
myDataColumn4.ColumnName = "列四";
DataColumn myDataColumn5 = new DataColumn();
dt.Columns.Add(myDataColumn5);
myDataColumn5.DataType = System.Type.GetType("System.String");
myDataColumn5.ColumnName = "列五";
DataColumn myDataColumn6 = new DataColumn();
dt.Columns.Add(myDataColumn6);
myDataColumn6.DataType = System.Type.GetType("System.String");
myDataColumn6.ColumnName = "列六";
//
ds = anc.RunProc("select dept_id,dept_name,dept_man,dept_up,dept_info,sc_id from zw_dept", ds);
//
dts = ds.Tables[0];
readDR("0");//查找节点
GridView1.DataSource = ds.Tables[0].DefaultView;
GridView1.DataBind();//
GridView2.DataSource = dt.DefaultView;
GridView2.DataBind();//显示要得到的结果
}
//查找子节点
protected void readDR(string dept_up)
{
//Response.Write(dts.Rows[0][0].ToString());
string str = "-----------------------------------------------------------------------------------------";
//字符串前加的头
if (temp.IndexOf(dept_up) == -1)
{
temp.Add(dept_up);
//把ArrayList中没有的父节点加入
}
p = temp.Count - 1;//初始化P,要取str时读该变量,得到缩进的长度
for (j = 0; j < dts.Rows.Count; j++)
{
if (dts.Rows[j]["dept_up"].ToString() == dept_up)//找到字节点
{
string temp2;
//
dr = dt.NewRow();
dr[0] = dts.Rows[j][0].ToString();
//Response.Write("调试用
dr[1] = "|"+str.Substring(0, (p+1)*4) + dts.Rows[j]["dept_name"].ToString();
dr[2]= dts.Rows[j][2].ToString();
dr[3]= dts.Rows[j][3].ToString();
dr[4]= dts.Rows[j][4].ToString();
dr[5] = dts.Rows[j][5].ToString();
dt.Rows.Add(dr);
temp2 = dts.Rows[j]["dept_id"].ToString();
dts.Rows.Remove(dts.Rows[j]);
//
if (hasChild(temp2))//是否有字节点
{
readDR(temp2);//递归
}
for (p = temp.Count-1; p >= 0; p--)//返回上个‘父节子’继续查找
{
// Response.Write("调试用
if (hasChild((string)temp[p]))
{
for (int h = 0; h < dts.Rows.Count; h++)
{
readDR((string)temp[p]);
}
}
else
{
temp.RemoveAt(p);//该父节点没有子节点,则删除该父节点
}
}
}
}
}
//判断是否有子节点
protected bool hasChild(string dept_up)
{
int f;
for (f = 0; f < dts.Rows.Count; f++)
{
if (dts.Rows[f]["dept_up"].ToString() == dept_up)
{
return true;
}
}
return false;
}
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有