下面代码测试通过.树结构可以放在一个表中实现,记录ID及父项ID就可以.测试数据 -- fuqin 父ID -- daishu 代数 create table table1 (id int,name nvarchar(20),fuqin int,daishu int) insert into table1 select 1 as id, '第0代' as name,0 as fuqin,0 as daishu union all select 2 as id, '第1代01' as name,1 as fuqin,1 as daishu union all select 3 as id, '第1代02' as name,1 as fuqin,1 as daishu union all select 4 as id, '第2代01' as name,2 as fuqin,2 as daishu union all select 5 as id, '第2代02' as name,2 as fuqin,2 as daishu union all select 6 as id, '第2代01' as name,3 as fuqin,2 as daishu union all select 7 as id, '第2代02' as name,3 as fuqin,2 as daishu union all select 8 as id, '第3代01' as name,7 as fuqin,3 as daishu union all select 9 as id, '第3代02' as name,7 as fuqin,3 as daishu 页面设计<body> <form id="form1" runat="server"> <div> <table > <tr> <td colspan=></td> </tr> </table> <asp:TreeView ID="TreeView1" runat="server"> </asp:TreeView> <br /> <asp:Button ID="btnBuild" runat="server" onclick="btnBuild_Click" Text="Build Tree" /> </div> </form> </body> 后台代码private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=;"; protected void btnBuild_Click(object sender, EventArgs e) {
SqlConnection con = new SqlConnection(); con.ConnectionString = conString; con.Open(); string sqlSelect = "Select * From table1"; SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con); DataTable dt = new DataTable(); adapter.Fill(dt); // 代数为0的纪录 DataRow[] drs = dt.Select("daishu=0"); TreeView1.Nodes.Clear(); foreach(DataRow dr in drs) { TreeNode node = new TreeNode(dr["name"].ToString()); node.Value = dr["name"].ToString(); // 创建下级节点 CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node); TreeView1.Nodes.Add(node); } adapter.Dispose(); con.Close(); } /// <summary> /// 创建子节点 /// </summary> /// <param name="dt">世系表 </param> /// <param name="fuqin">父亲 </param> /// <param name="parentNode">父节点 </param> private void CreateSubNode(DataTable dt,int fuqin,TreeNode parentNode) { DataRow[] drs = dt.Select(string.Format("fuqin={0}",fuqin)); foreach(DataRow dr in drs) { TreeNode node = new TreeNode(dr["name"].ToString()); node.Value = dr["name"].ToString(); // 创建下级节点 CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node); parentNode.ChildNodes.Add(node); } }
如果你数据量小的话可以设计成一张表一个孩子接点一个字段,查出来用分组处理,再循环复制到树控件中去,如果数据量大的话建议设计一个孩子节点一张表通过主外键一级一级关联。补充:如果你的孩子节点是动态可配置的话,建议设计成一张表好处理些,也可以另类设计,如建表 TABLE1 字段 IDS,菜单名,上级菜单ID,菜单级数(INT 1...n)查出视图可以根据“菜单级数”字段动态生成:SELECT DECODE(菜单级数,1,菜单名,NULL) AS 一级菜单,DECODE(菜单级数,2,菜单名,NULL) AS 二级菜单,上级菜单ID,IDS FROM TABLE1 ORDER BY 菜单级数,怎么画就不用写了吧,GOOGLE上一搜代码一大堆,看你怎么发挥写了。建议全写成动态的以后维护方便。
参考
一列是treeview各节点的名称(文本值)
一列是有规律的数字
如第一个根节点是001
第一个根节点的第一个子节点为001001
具体怎么简化可以自己想参照这个简化
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11using System.Data.OracleClient;
12using Microsoft.Web.UI.WebControls;
13using System.Data.SqlClient;
14namespace test
15{
16 /**//// <summary>
17 /// WebForm5 的摘要说明。
18 /// </summary>
19 public class WebForm5 : System.Web.UI.Page
20 {
21 protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
22
23 private DataTable objDataTable;
24
25 private void Page_Load(object sender, System.EventArgs e)
26 {
27 // 在此处放置用户代码以初始化页面
28
29
30 objDataTable = GetBackupRecord(); //取得所有数据得到DataTable
31 this.CreateTree( TreeView1.Nodes,"0" ); //建立节点
32 }
33
34 Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
35 override protected void OnInit(EventArgs e)
36 {
37 //
38 // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
39 //
40 InitializeComponent();
41 base.OnInit(e);
42 }
43
44 /**//// <summary>
45 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
46 /// 此方法的内容。
47 /// </summary>
48 private void InitializeComponent()
49 {
50 this.Load += new System.EventHandler(this.Page_Load);
51
52 }
53 #endregion
54
55绑定树控件#region 绑定树控件
56 private void CreateTree( TreeNodeCollection node,string parent_id )
57 {
58 DataView dvList = new DataView( this.objDataTable );
59 dvList.RowFilter = "parentiidd=" + parent_id + ""; //过滤父节点
60 TreeNode nodeTemp;
61 foreach ( DataRowView dv in dvList )
62 {
63 nodeTemp = new TreeNode();
64 nodeTemp.ID = dv["iidd"].ToString(); //节点ID
65 nodeTemp.Text = dv["type"].ToString(); //节点名称
66 //nodeTemp.NavigateUrl = dv["ADDRESS"].ToString(); //节点链接地址
67 //nodeTemp.ImageUrl = dv["IMAGE"].ToString(); //节点图片(未展开)
68 //nodeTemp.SelectedImageUrl = dv["IMAGE_EX"].ToString(); //节点图片(展开)
69 nodeTemp.Target = "_parent"; //节点链接Target
70
71 node.Add( nodeTemp ); //加入节点
72 this.CreateTree( nodeTemp.Nodes,nodeTemp.ID ); //递归
73
74
75
76 }
77 }
78#endregion
79
80
81得到数据#region 得到数据
82 public DataTable GetBackupRecord()
83 {
84 try
85 {
86
87 string str="server=localhost;database=lsa1008pt;uid=sa;pwd=sundun";
88 SqlConnection conn=new SqlConnection(str);
89 SqlDataAdapter da=new SqlDataAdapter("select * from gg_bilu_wenhuatype",conn);
90
91 DataSet dataSet =new DataSet();
92 da.Fill(dataSet);
93
94 return dataSet.Tables[0];
95 }
96 catch(Exception e)
97 {
98 throw e;
99 }
100 }
101#endregion
102 }
103}
id description parentid
parentID childID
1 58
1 64
1 65
1 2
2 3
2 4
3 24
3 15
65 54
这个父子关系表记录你的树形目录中所有的父子关系
即使某个对象,比方讲对象1,有子对象2,孙对象3,重孙对象24和15
在这个表中把他们拆分成成对的父子关系
你要记住的顶级对象是谁,如果顶级对象是1,简要流程如下:
------------------------------------------------------------------------
顶级树节点设为对象1添加子节点函数(参数为你的当前对象『首次调用时为对象1』,和对应的树节点)
{
向父子关系表检索以当前对象为父亲的所有父子关系。
遍历每一对父子关系
{
对应子对象建立一个树节点,挂到当前为父节点的树节点
向父子关系表查询当前子对象是否还有有子对象,如果有,则自身调用添加子节点函数
}
}------------------------------------------------------------------------这样就行了
id 节点id
name 节点名
parentid 父节点id(根节点父节点为0)
代码如下public partial class AdminManage_TieZiManage_TieLeft : System.Web.UI.Page
{
DataTable dt = null;
protected void Page_Load(object sender, EventArgs e)
{
dt = bankuaidal.GetDataTable();
InitTree();
}
private void InitTree() //取根节点
{
DataRow[] drs = dt.Select("q_ParentID=0", "q_ID asc"); for (int i = 0; i < drs.Length; i++)
{
TreeNode tn = new TreeNode(drs[i][1].ToString());
tn.SelectAction = TreeNodeSelectAction.Expand;
this.TreeView1.Nodes.Add(tn); LoadTree(tn, Convert.ToInt32(drs[i][0]));//递归
}
}
private void LoadTree(TreeNode tn, int parentid)//一直递归下去,直到没有子节点
{
DataRow[] drs = dt.Select("q_ParentID=" + parentid, "q_ID asc");
for (int i = 0; i < drs.Length; i++)
{
TreeNode child = new TreeNode(drs[i][1].ToString()); child.NavigateUrl = "~/AdminManage/TieZiManage/BanKuaiTie.aspx?id=" + Convert.ToInt32(drs[i][0]);
child.Target = "tright";
child.SelectAction = TreeNodeSelectAction.Expand; tn.ChildNodes.Add(child); LoadTree(child, Convert.ToInt32(drs[i][0]));
}
}
}
数据库:公司:id(int) company(varchar(50)部门:id(int) deid(int) department(varchar(50))班组:id(int) coid(int) class(varchar(50))DB DBManager = new DB();//实例化数据库操作类
string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["rizhi"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//TreeView1.Attributes.Add("onclick", "OnTreeNodeChecked()");
TreeView1.Attributes.Add("onclick", "testClick(event);return true;");//单击文字,CheckBox=true TreeView1.ShowCheckBoxes = TreeNodeTypes.Leaf;//最后一级选中
TreeView1.ExpandDepth = 0;//不展开 using (SqlConnection conn = new SqlConnection(strConn))
{
DataSet ds_company = new DataSet();//实例化数据集(公司)
SqlDataAdapter sda_company = new SqlDataAdapter("select * from [company] where id<>"+0+" and id<>"+1001, conn);//实例化数据适配器(公司)
sda_company.Fill(ds_company, "company");//虚拟表填充到内存
for (int i = 0; i < ds_company.Tables["company"].Rows.Count; i++)//循环所有"公司"
{
TreeNode td_company = new TreeNode();//实例化公司节点
td_company.Text = ds_company.Tables["company"].Rows[i]["company"].ToString();//公司节点名称
TreeView1.Nodes.Add(td_company);//将公司节点添加至"树"
td_company.SelectAction = TreeNodeSelectAction.Expand; DataSet ds_department = new DataSet();//实例化数据集(部门)
SqlDataAdapter sda_department = new SqlDataAdapter("select * from [department] where [coid]=" + ds_company.Tables["company"].Rows[i]["id"]+" and department<>'全公司'" , conn);//实例化数据库适配器(部门)
sda_department.Fill(ds_department, "department");//虚拟表填充到内存
for (int j = 0; j < ds_department.Tables["department"].Rows.Count; j++)//循环 ds.Tables["department"].Rows[i]["id"] 对应的所有部门
{
TreeNode td_department = new TreeNode();//实例化部门节点
td_department.Text = ds_department.Tables["department"].Rows[j]["department"].ToString();//部门节点名称
td_company.ChildNodes.Add(td_department);//填充部门节点至"树"
td_department.SelectAction = TreeNodeSelectAction.Expand;//只允许展开 #region 如果人员属于某个班组
if (DBManager.getDs("select [info] from [user] where [pid]=" + ds_department.Tables["department"].Rows[j]["id"] + "", "is").Tables["is"].Rows.Count == 0)
{ DataSet ds_class = new DataSet();//实例化数据集(班组)
SqlDataAdapter sda_class = new SqlDataAdapter("select * from [class] where [deid]=" + ds_department.Tables["department"].Rows[j]["id"], conn);//实例化数据库适配器(班组)
sda_class.Fill(ds_class, "class");//虚拟表填充到内存
for (int z = 0; z < ds_class.Tables["class"].Rows.Count; z++)//循环 ds_department.Tables["class"].Rows[j]["id"] 对应的所有班组
{
TreeNode td_class = new TreeNode();//实例化班组节点
td_class.Text = ds_class.Tables["class"].Rows[z]["class"].ToString();//班组节点名称
td_department.ChildNodes.Add(td_class);//填充班组节点至"树"
td_class.SelectAction = TreeNodeSelectAction.Expand;//只允许展开 DataSet ds_user = new DataSet();//实例化数据集(人员)
SqlDataAdapter sda_user = new SqlDataAdapter("select [name] from [user] where [pid]=" + ds_class.Tables["class"].Rows[z]["id"] + "", conn);////实例化数据库适配器(人员)
sda_user.Fill(ds_user, "user");//虚拟表填充到内存
for (int k = 0; k < ds_user.Tables["user"].Rows.Count; k++)//循环 ds_department.Tables["user"].Rows[k]["name"] 对应的所有人员
{
TreeNode td_user = new TreeNode();//实例化班组节点
td_user.Text = ds_user.Tables["user"].Rows[k]["name"].ToString();//人员节点名称
td_class.ChildNodes.Add(td_user);//填充人员节点至"树"
td_user.NavigateUrl = "javascript:void(0)";//选中,但无效
}
}
}
#endregion #region 如果人员直接属于某个部门
else
{
DataSet ds_user = new DataSet();
SqlDataAdapter sda_user = new SqlDataAdapter("select [name] from [user] where [pid]=" + ds_department.Tables["department"].Rows[j]["id"] + "", conn);
sda_user.Fill(ds_user, "user");
for (int k = 0; k < ds_user.Tables["user"].Rows.Count; k++)
{
TreeNode td_user = new TreeNode();
td_user.Text = ds_user.Tables["user"].Rows[k]["name"].ToString();
td_department.ChildNodes.Add(td_user);
td_user.NavigateUrl = "javascript:void(0)";
}
}
#endregion
}
}
}
}
}
string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["rizhi"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataSet ds = new DataSet();
SqlConnection conn = new SqlConnection(strConn);
using (conn)
{
SqlDataAdapter sda_Company = new SqlDataAdapter("select [id],[company] from [company]", conn);
sda_Company.Fill(ds, "company");
TreeNode tn_Company;
TreeNode tn_Department;
TreeNode tn_Class;
foreach (DataRow company_row in ds.Tables["company"].Rows)
{
tn_Company = new TreeNode();
tn_Company.Text = company_row["company"].ToString();
tn_Company.Value = company_row["id"].ToString();
TreeView1.Nodes.Add(tn_Company); SqlDataAdapter sda_Department = new SqlDataAdapter("select [id],[department] from [department] where coid=" + tn_Company.Value, conn);
sda_Department.Fill(ds, "department");
if (ds.Tables["department"].Rows.Count > 0)
{
foreach (DataRow department_row in ds.Tables["department"].Rows)
{
tn_Department = new TreeNode();
tn_Department.Text = department_row["department"].ToString();
tn_Department.Value = department_row["id"].ToString();
tn_Company.ChildNodes.Add(tn_Department); SqlDataAdapter sda_Class = new SqlDataAdapter("select [id],[class] from [class] where deid=" + tn_Department.Value, conn);
sda_Class.Fill(ds, "class");
if (ds.Tables["class"].Rows.Count > 0)
{
foreach (DataRow class_row in ds.Tables["class"].Rows)
{
tn_Class = new TreeNode();
tn_Class.Text = class_row["class"].ToString();
tn_Class.Value = class_row["id"].ToString();
tn_Department.ChildNodes.Add(tn_Class);
}
ds.Tables["class"].Clear();
}
sda_Class.Dispose();
}
ds.Tables["department"].Clear();
}
sda_Department.Dispose();
}
sda_Company.Dispose(); }
}
}
{
ds = new DataSet();
using (SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter("select * from [class]", conn);
sda.Fill(ds);
}
AddTree(101, (TreeNode)null);
} public void AddTree(int ParentID,TreeNode pNode)
{ DataView dvTree = new DataView(ds.Tables[0]);
string Fstr = "[deid]=" + ParentID;
dvTree.RowFilter = Fstr;
foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{
Node.Value = Row["id"].ToString();
Node.Text = Row["class"].ToString();
TreeView1.Nodes.Add(Node);
AddTree(Int32.Parse(Row["id"].ToString()), Node);
}
else
{
Node.Value = Row["id"].ToString();
Node.Text = Row["class"].ToString();
pNode.ChildNodes.Add(Node);
AddTree(Int32.Parse(Row["id"].ToString()), Node);
}
}
}
1 A 0
2 B 0
3 C 0
3 A-1 1
4 A-2 1
5 A-3 1
6 B-1 2
7 B-2 2
8 B-3 2
9 C-1 3
10 C-2 3
11 C-3 3
12 C-21 11自己看吧
id pid cid name
id 父节点id 子节点id 叶子名然后检索出来数据
绑定到treeview就好了
一列是treeview各节点的名称(文本值)
一列是有规律的数字
如第一个根节点是001
第一个根节点的第一个子节点为001001
具体怎么简化可以自己想参照这个简化
TreeView
字段 ID(int),ParentID(int),TreeNodeName(string)
也就是让这个表的记录存在父子关系
-- fuqin 父ID
-- daishu 代数
create table table1 (id int,name nvarchar(20),fuqin int,daishu int) insert into table1
select 1 as id, '第0代' as name,0 as fuqin,0 as daishu
union all
select 2 as id, '第1代01' as name,1 as fuqin,1 as daishu
union all
select 3 as id, '第1代02' as name,1 as fuqin,1 as daishu
union all
select 4 as id, '第2代01' as name,2 as fuqin,2 as daishu
union all
select 5 as id, '第2代02' as name,2 as fuqin,2 as daishu
union all
select 6 as id, '第2代01' as name,3 as fuqin,2 as daishu
union all
select 7 as id, '第2代02' as name,3 as fuqin,2 as daishu
union all
select 8 as id, '第3代01' as name,7 as fuqin,3 as daishu
union all
select 9 as id, '第3代02' as name,7 as fuqin,3 as daishu 页面设计<body>
<form id="form1" runat="server">
<div>
<table >
<tr>
<td colspan=></td>
</tr>
</table>
<asp:TreeView ID="TreeView1" runat="server">
</asp:TreeView>
<br />
<asp:Button ID="btnBuild" runat="server" onclick="btnBuild_Click"
Text="Build Tree" />
</div>
</form>
</body>
后台代码private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=;";
protected void btnBuild_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = conString;
con.Open();
string sqlSelect = "Select * From table1";
SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con);
DataTable dt = new DataTable();
adapter.Fill(dt); // 代数为0的纪录
DataRow[] drs = dt.Select("daishu=0"); TreeView1.Nodes.Clear();
foreach(DataRow dr in drs)
{
TreeNode node = new TreeNode(dr["name"].ToString());
node.Value = dr["name"].ToString();
// 创建下级节点
CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node);
TreeView1.Nodes.Add(node);
} adapter.Dispose();
con.Close();
} /// <summary>
/// 创建子节点
/// </summary>
/// <param name="dt">世系表 </param>
/// <param name="fuqin">父亲 </param>
/// <param name="parentNode">父节点 </param>
private void CreateSubNode(DataTable dt,int fuqin,TreeNode parentNode)
{
DataRow[] drs = dt.Select(string.Format("fuqin={0}",fuqin));
foreach(DataRow dr in drs)
{
TreeNode node = new TreeNode(dr["name"].ToString());
node.Value = dr["name"].ToString();
// 创建下级节点
CreateSubNode(dt,Convert.ToInt32(dr["Id"]),node);
parentNode.ChildNodes.Add(node);
}
}
地址 http://www.cnblogs.com/CShapWinForms/archive/2006/04/15/376028.html
数据表:
ID,名称,上级ID
public void treeView(TreeView tree, TableName tableName,string sqlstr)
{
string[] list = tableName == TableName.dept ? dept : tableName == TableName.store ? store : tableName == TableName.type ? type : null;
tree.Nodes.Clear();
DataTable dt = ConvertDataReaderToDataTable(DRSetSql(sqlstr));
DataRow[] drow = dt.Select(list[0].ToString() + 0); if (drow.Length <= 0) return; for (int i = 0; i < drow.Length; i++)
{
TreeNode tr = new TreeNode(drow[i][list[1].ToString()].ToString(), drow[i][list[2].ToString()].ToString());
tr.NavigateUrl = "#" + drow[i][list[1].ToString()].ToString() + "&" + drow[i][list[2].ToString()].ToString();
treeNote(tr, drow[i][list[2].ToString()].ToString(), dt, list);
tree.Nodes.Add(tr);
}
}
public void treeNote(TreeNode tn, string upperID, DataTable de, string[] list)
{
DataRow[] drow = de.Select(list[0].ToString() + upperID); if (drow.Length <= 0) return; for (int i = 0; i < drow.Length; i++)
{
TreeNode node = new TreeNode(drow[i][list[1].ToString()].ToString(), drow[i][list[2].ToString()].ToString());
node.NavigateUrl = "#" + drow[i][list[1].ToString()].ToString() + "&" + drow[i][list[2].ToString()].ToString();
treeNote(node, drow[i][list[2].ToString()].ToString(), de, list);
tn.ChildNodes.Add(node);
}
}
读取
11 aaa 0(根节点)
12 bbb 0
1101 ffff 11
1202 uuuu 12
http://blog.csdn.net/gislinggis/archive/2006/12/29/1466893.aspx
参考吧
先设父节点,有开始,下面就是递归了,层数自己想多就是多少了二、用xml文档
这个只要把XML文档设计好,直接读就行了
要有别的方法,请补充!再过会就结贴我再加100分,来的都有分,有帮助的更多
ID Name ParentID
1 t1 0
2 t2 0
3 t3 2
4 t4 1
5 t5 4
6 t6 5这样表示,不管你多少层都可以 0表示根节点~
ID - ParentID -Text
就完了啊,仔细想想
根ID=-1或0