这个生成Treeview的递归有什么问题?请大家帮看看吧,郁闷了N天了

半截烟头 2007-10-12 08:15:49
程序如下:
#region //处理树节点
private TreeNode ProcessTreeNode(ECobj e, TreeNodeCollection tCol)//ECObj 是一个自定义对象
{
TreeNode tNode = new TreeNode();
//装入导航树节点标题
tNode.Text = eci.Name;
//记录导航树节点ID值
tNode.Value = eci.ID.ToString();
try
{
tCol.Add(tNode);
return tNode;
}
catch { return null; }
}
else{return null;}
}

#endregion
//说明:上面这过程没有问题,对正常加入节点

#region //递归增加节点
public void AddTreeNode(long PID, TreeNode td)
{
ECObjS ec = new ECObjS();//ECObjS也是一个自定义对象,是集合类型
ec.FindChildren(ClsID,1);//查找当前ClsID下的第一层子,问题就出现在这儿,当第一次查找到的子节点有两个或两个以上的时候,下面的循环永远只能对第一个节点执行递归,为什么啊.
for (int i = 0; i < ec.Count; i++)
{
AddTreeNode(ec[i].ClsID, ProcessTreeNode(ec[i], td.ChildNodes));
}

}
#endregion
...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Arthur_qi 2007-10-13
  • 打赏
  • 举报
回复

给你一点我做的程序,是从数据库里读出书,希望对你有帮助,读的方法很多,仅供参考啊~!
public void CreatTreeView()
{
for (int i = 0; i < tv.Nodes.Count; i++)
{
foreach (TreeNode st in tv.Nodes)
{
if (st.Tag.ToString() == "0")
{
tNodes.Add((TreeNode)st.Clone());
tv.Nodes.Remove(st);
}
}
}
foreach(TreeNode nodeP in tNodes)
{
zhaohaizi(nodeP);
}

}
public void zhaohaizi(TreeNode nodeP)
{
foreach (TreeNode nodeC in tv.Nodes)
{
if (nodeC.Tag.ToString().Trim() == nodeP.Name)
{
zhaohaizi(nodeC);
nodeP.Nodes.Add((TreeNode)nodeC.Clone());
}
}
}
说明下,Tag里放的父亲的ID,0表示没有父亲,先把所有接点都放到一个树里,然后从那个树里找出来。具体你继续做把,用多循环加判断也可以做,用递归会好点,而且容易读。
我同事和我的方法不一样不过也实现里,你自己想想,方法很多,找个最优化的就好~!
xuan.ye 2007-10-13
  • 打赏
  • 举报
回复
public void AddTreeNode(long PID, TreeNode td)
{
ECObjS ec = new ECObjS();//ECObjS也是一个自定义对象,是集合类型
ec.FindChildren(ClsID,1);//查找当前ClsID下的第一层子,问题就出现在这儿,当第一次查找到的子节点有两个或两个以上的时候,下面的循环永远只能对第一个节点执行递归,为什么啊.
for (int i = 0; i < ec.Count; i++)
{
AddTreeNode(ec[i].ClsID, ProcessTreeNode(ec[i], td.ChildNodes));
}

1. 添加结点到数据库
2.重新递归
}
Arthur_qi 2007-10-12
  • 打赏
  • 举报
回复


要把现在循环到的接点当成下一次调用自己的接点集合,在以他为根的树里继续找,然后不停的递归,一直到没有儿子了然后返回,然后可龙,就可以动态的生成一个无限深的树了,呵呵~!
然后再考虑,如何把树存到数据库里(XML),都搞好了,就可以做个系统角色设置的功能了,呵呵~!
iamybj 2007-10-12
  • 打赏
  • 举报
回复
asp.net2.0的treeview可以自动帮顶到一个实现了什么借口的xml数据源,所以,与其自己写低归,不如自己写个数据源更合理。
Eddie005 2007-10-12
  • 打赏
  • 举报
回复
显然这个算法有问题,楼主单步执行,观察一下递归调用的顺序就明白了

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧