首页 新闻 会员 周边

关于多表生成Treeview 的问题。

0
悬赏园豆:30 [已解决问题] 解决于 2012-04-06 13:51

我现在想生成一个组织机构图,用Treeview 来显示。

涉及的表格 公司表(Corp),字段为 corpid,corpname,parentid.

部门实例表 (DeparmentIntance) 字段为 DeptInstantID,DeptID,corpid,ParentID

部门表(department)字段为DeptID,DeptName

岗位实例表 (PositionInstant)字段为PosInstID,DeptInstantID,PositionID

岗位表 (Org_Position)字段为PositionID,PositionName

原理:部门和岗位通过实例的形式实现,生成 组织机构如下:

XXX公司

    XXX中心

        XXX 部门

           xxx 岗位

BBBB公司

     BBB部门

        BBB 岗位

 

我已经晕菜了,不知道那位可以帮忙分析一下啊。

问题补充:
 1     #region 以下代码为了生成组织机构树
2
3
4 public static DataSet getDateSet(string sql)
5 {
6 SqlConnection conn = Database.getcon ();
7
8 DataSet ds = new DataSet ();
9
10
11 SqlDataAdapter theAd = null;
12 try
13 {
14 conn.Open ();
15 theAd = new SqlDataAdapter ( sql, conn );
16 theAd.Fill ( ds );
17 }
18 catch ( Exception ex )
19 {
20 Console.Write (ex.ToString());
21 }
22 finally
23 {
24 if ( theAd != null )
25 theAd = null;
26 }
27
28 return ds;
29 }
30
31 public static DataSet GetMainMenu() // 生成临时表sql
32 {
33 string strSQL = "";
34 strSQL = @"if object_id('tempdb..#Temp_A') is not null drop table #Temp_A ;
35 if object_id('tempdb..#Temp_B') is not null drop table #Temp_B ;
36 if object_id('tempdb..#Temp_C') is not null drop table #Temp_C;
37
38 select * into #Temp_A from (select s1.CorpID AS NodeID,s1.CorpName AS Node,s1.Superior_CorpID as parentid from Org_Corporation s1) T where T.parentid=0 order by NODE asc
39 select * into #Temp_B from (
40 select s2.DeptInstantID,s2.DeptName,s2.CorpID from( select x1.CorpID,DeptInstantID,x2.DeptName from Org_DeptInstant x1 left join Org_Department x2 on x1.DeptID=x2.DeptID)as s2 ) T WHERE T.CorpID!=0
41
42 select * into #Temp_C from (
43 select s3.PosInstID,s3.PositionName,s3.DeptInstantID from (select x1.PosInstID, x1.DeptInstantID,x2.PositionName from Org_PositionInstant x1 left join Org_Position x2 on x1.PositionID=x2.PositionID ) as s3) T
44
45 select * from #Temp_A union select * from #Temp_B union select * from #Temp_C";
46
47 DataSet MenuDs = getDateSet ( strSQL );
48 return MenuDs;
49 }
50
51 public static string BuildTree(System.Web.UI.WebControls.TreeView tree) // 初始化 tree 树
52 {
53 DataSet menuDS = GetMainMenu ();
54 if ( menuDS.Tables[0].Rows.Count == 0 )
55 {
56 menuDS.Dispose ();
57
58 }
59 DataView dvMenu = menuDS.Tables[0].DefaultView;
60 dvMenu.RowFilter = "[parentid]= '0'";
61 System.Web.UI.WebControls.TreeNode rootNode;
62
63 foreach ( DataRowView dvMenuRow in dvMenu )
64 {
65 rootNode = new System.Web.UI.WebControls.TreeNode ();
66 rootNode.Text = dvMenuRow["Node"].ToString ();
67 rootNode.Value = dvMenuRow["NodeID"].ToString ();
68 rootNode.ToolTip = dvMenuRow["Node"].ToString ();
69 tree.Nodes.Add ( rootNode );
70 addChildNodes (dvMenuRow["NodeID"].ToString().Trim(), rootNode, dvMenu );
71 }
72 menuDS.Dispose ();
73 return "";
74 }
75 public static void addChildNodes(string PID, System.Web.UI.WebControls.TreeNode pNode, DataView dvMenu)
76 {
77 string oldFilter = dvMenu.RowFilter;
78 dvMenu.RowFilter = "[parentid]='"+PID+"'";
79
80 System.Web.UI.WebControls.TreeNode childNode;
81 foreach ( DataRowView dvMenuRow in dvMenu )
82 {
83 childNode = new System.Web.UI.WebControls.TreeNode ();
84 childNode.Text = dvMenuRow["Node"].ToString ();
85 childNode.Value = dvMenuRow["NodeID"].ToString ();
86 childNode.ToolTip = dvMenuRow["Node"].ToString ();
87 pNode.ChildNodes.Add ( childNode );
88 addChildNodes ( dvMenuRow["NodeID"].ToString ().Trim (), childNode, dvMenu );
89 }
90 dvMenu.RowFilter = oldFilter;
91 }
92 #endregion

以上是我的代码,但是为什么总是提示我

 


 

figofeng的主页 figofeng | 初学一级 | 园豆:5
提问于:2012-04-05 23:49
< >
分享
最佳答案
0
select copid as ID,copName as Name, 0 as ParentID
from Companytable
union
select d.departmentId as ID,d.deparentmentName as Name, d.companyid as ParentID
from departmenttable d
union
select p.positionid as ID,p.positionname as Name,p.departmentid as ParentID
from positiontable p

上面只是表意的代码,你根据自己的表结构做一下调整

收获园豆:20
玉开 | 大侠五级 |园豆:8822 | 2012-04-06 08:47

overflow了,肯定是递归没有跳出控制。

玉开 | 园豆:8822 (大侠五级) | 2012-04-06 13:36
其他回答(1)
0

表有点多,不过也没那么复杂,说白了就是一个无限级分类,把循环做好了,将所有数据写入一个表(DataTable)中,继而绑定就好。。

1.循环公司表,将公司作为首级节点,添加到表中

2.在公司循环中再循环该公司下的部门实例表,通过部门ID找到部门信息,部门作为二级节点,添加到表中

3.在部门循环中再循环该岗位下的岗位实例表,通过岗位ID找到岗位信息,岗位作为三级节点,添加到表中

4.将表(DataTable)绑定到TreeView,就可以了

收获园豆:10
KivenRo | 园豆:1734 (小虾三级) | 2012-04-06 06:55

您的意思是先把几个表UNION 到一个表内,然后对一个表操作,是不是?能否给出具体的SQL 语句那?谢谢。

支持(0) 反对(0) figofeng | 园豆:5 (初学一级) | 2012-04-06 07:44

我的意思是用程序代码来实现,去实例一个DataTable,通过循环添加数据,继而绑定这个自定义的表:

DataTable dt=new DataTable;

dt.Columns.Add("ID");

dt.Columns.Add("Name");

通过循创建行,并填入数据:

DataRow row=dt.NewRow();

row["ID"]="数据编号";

row["Name"]="数据名称";

最后直接对TreeView绑定数据表dt。

如果可以将各个表通过SQL语句进行联合查询出来,这样会更好一些。。。

你可以参考一下楼下那位兄台的代码。。。

支持(0) 反对(0) KivenRo | 园豆:1734 (小虾三级) | 2012-04-06 09:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册