读书人

怎么写一个可以任意增长宽度和深度的树

发布时间: 2012-01-01 23:10:55 作者: rapoo

如何写一个可以任意增长宽度和深度的树
总的想法就是建立一个导航目录,目录下面有子目录,子目录还可以有子目录,可以任意添加个数,类似于csdn论坛左边导航兰的形式。我个人想法用treeview这个控件,然后结构是不是可以用数状的结构?设置父结点和子结点的方式?
我昨天想了一个晚上,是不是在数据库中设置一个字段为父节点,让所有的纪录通过这个父节点与其他纪录连接起来。然后我又想是不是可以用递归的方法将整个树都读出来,然后输出成sitemap这个xml文件,然后用treeview然调用这个文件显示这个树状目录。
我是一个做毕业设计的新手阿,没有什么经验,大家有时间的话帮我出出主意阿,你们做这种任意添加子数 的目录的时候一般用的是什么方法阿,还有我上面说的方法可行吗??

[解决办法]
可行!支持学习
[解决办法]
表结构:
id, parentid, name, navigetUrl, target,...
先读到数据集中,然后调用下面的函数:
FillTree(DataSet1.xxTable, TreeView1.Nodes, "根的父结点ID,比如-1 ", "父结点字段名 ", "排序字段名 ", "显示文本字段名 ", "传到新页面的值字段名 ", NavigetUrl, Target);
适用于框架结构,如果不是这种结构,自己改一下就是了。

/// <summary>
/// 填充树控件
/// </summary>
/// <param name= "dt "> 树控件结构所在表 </param>
/// <param name= "tns "> 节点集合 </param>
/// <param name= "strParentID "> 父节点值 </param>
/// <param name= "strParentField "> 父节点字段 </param>
/// <param name= "strSortField "> 排序字段 </param>
/// <param name= "strTextField "> 显示文本字段 </param>
/// <param name= "strValueField "> 值字段 </param>
/// <param name= "strNavigate "> 导航页 </param>
/// <param name= "strTarget "> 导航目标 </param>
public void FillTree(DataTable dt, TreeNodeCollection tns, string strParentID, string strParentField, string strSortField, string strTextField, string strValueField, string strNavigate, string strTarget)
{
TreeNode tn = null;
DataRow[] drs = dt.Select(string.Format( "{0}={1} ", strParentField, strParentID), strSortField);

foreach (DataRow dr in drs)
{
tn = new TreeNode();
tn.Text = dr[strTextField].ToString();
tn.Value = dr[strValueField].ToString();
tn.NavigateUrl = string.Format( "{0}?P={1} ", strNavigate, dr[strValueField]);
tn.Target = strTarget;
tns.Add(tn);

FillTree(dt, tn.ChildNodes, dr[strValueField].ToString(), strParentField, strSortField, strTextField, strValueField, strNavigate, strTarget);
}
}
[解决办法]
http://www.codeproject.com/aspnet/ExtendedTreeView.asp
这里有代码

用XML的例子
http://www.codeproject.com/csharp/TreeView_Serializer.asp
[解决办法]
private void Page_Load(object sender, System.EventArgs e){ if(!this.IsPostBack){this._BindTree();} }private void _BindTree(){if(this.tvDept.Nodes.Count> 0)this.tvDept.Nodes.Clear(); DataTable dtDept = new CDept().GetDeptInfoByCond( " "); DataRow[] rows = dtDept.Select( "ParentID = 0 ");for(int i=0;i <rows.Length;i++){ TreeNode node = new TreeNode(); node.Text = " <label oncontextmenu= 'javascript:return ShowMenu( " + rows[i][ "Id "].ToString() + ") ' onclick=\ "javascript:return GoUrl( ' " + rows[i][ "Id "].ToString() + " ')\ "> " + rows[i][ "deptName "].ToString() + " </label> ";node.ImageUrl = "../images/house.ico ";node.Value = rows[i][ "Id "].ToString(); this.tvDept.Nodes.Add(node);this.AddChildNodes(ref dtDept, ref node);} this.tvDept.DataBind();} private void AddChildNodes(ref DataTable dtDept, ref TreeNode node){DataRow[] rows = dtDept.Select( "ParentID= "+ node.Value);for(int i=0;i <rows.Length;i++){ TreeNode NewNode = new TreeNode(); NewNode.Text = " <label oncontextmenu= 'javascript:return false ' onmouseup=\ "javascript:return GoUrl( ' " + rows[i][ "Id "].ToString() + " ')\ "> " + rows[i][ "deptName "].ToString() + " </label> ";NewNode.ImageUrl = "../images/house.ico "; NewNode.Value = rows[i][ "ID "].ToString();this.AddChildNodes(ref dtDept,ref NewNode);node.ChildNodes.Add(NewNode);} }


[解决办法]
思路大致就是这样的,主要的问题是树的刷新和状态控制等比较琐碎的小问题,会对你系统的使用产生一定的影响
[解决办法]
关注
[解决办法]
我的blog正好有两篇文章能够分布解决你这个的。

首先,你要一个好的数据库格式去存储树结构,要易于筛选的:《存储在二维表的树结构如何进行指定深度节点的查询》
http://www.cnblogs.com/cathsfz/archive/2006/12/12/589464.html

其次,你不应该将它生成静态xml然后再用XmlSiteMapProvider,而应该直接写一个调用数据库的SiteMapProvider:《十分钟内学会:根据数据库生成站点导航 》
http://www.cnblogs.com/cathsfz/archive/2006/12/29/607442.html

读书人网 >asp.net

热点推荐