日期:2014-05-19  浏览次数:20411 次

如何写一个可以任意增长宽度和深度的树
总的想法就是建立一个导航目录,目录下面有子目录,子目录还可以有子目录,可以任意添加个数,类似于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 AddChildN