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