我现在想生成一个组织机构图,用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
以上是我的代码,但是为什么总是提示我
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
上面只是表意的代码,你根据自己的表结构做一下调整
overflow了,肯定是递归没有跳出控制。
表有点多,不过也没那么复杂,说白了就是一个无限级分类,把循环做好了,将所有数据写入一个表(DataTable)中,继而绑定就好。。
1.循环公司表,将公司作为首级节点,添加到表中
2.在公司循环中再循环该公司下的部门实例表,通过部门ID找到部门信息,部门作为二级节点,添加到表中
3.在部门循环中再循环该岗位下的岗位实例表,通过岗位ID找到岗位信息,岗位作为三级节点,添加到表中
4.将表(DataTable)绑定到TreeView,就可以了
您的意思是先把几个表UNION 到一个表内,然后对一个表操作,是不是?能否给出具体的SQL 语句那?谢谢。
我的意思是用程序代码来实现,去实例一个DataTable,通过循环添加数据,继而绑定这个自定义的表:
DataTable dt=new DataTable;
dt.Columns.Add("ID");
dt.Columns.Add("Name");
通过循创建行,并填入数据:
DataRow row=dt.NewRow();
row["ID"]="数据编号";
row["Name"]="数据名称";
最后直接对TreeView绑定数据表dt。
如果可以将各个表通过SQL语句进行联合查询出来,这样会更好一些。。。
你可以参考一下楼下那位兄台的代码。。。