.net 递归生成树,根据编码进行递归.

昨天在网上一个网友帮忙让实现一个树的程序,表结构为:

 效果图:

看到表结构很汗颜,抛开字段的命名方式不说,实际开发中生成树一般会加一个parentid 字段,这样的话在递归的时候也会很方便,并且可以无限级别的递归,但像这种方式构造树的话局限多多,但既然人家这样给需求了,咱也不好改别人的需求不是吗?

研究了一下上面的表结构,发现前两位为第一级节点,中间三位为第二级节点,后面可能最多还有三级子节点,但是估计后面的一级节点的可能还是很小,为了通用,因此还是考虑到最佳状况.

众所周知,生成树的话,最常用的也最有效的手段就是递归,因此咱也不例外.花了十几分钟时间编写,调试.最终代码如下:

 

 
  
DBHelper dbhelper = new DBHelper();
protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
DataTable dt
= dbhelper.ReturnDataSet( " select * from biao order by bianma asc " ).Tables[ 0 ];
TreeView1.Nodes.Clear();
TreeNode Node1
= new TreeNode( " 根目录 " );
Node1.Value
= " root " ;
TreeView1.Nodes.Add(Node1);
CreateNode(dt, Node1,
" 000000 " );
}
}
/// <summary>
/// 存储已经创建的节点的编号.
/// </summary>
public ArrayList Code = new ArrayList();
/// <summary>
/// 递归创建树节点.
/// </summary>
/// <param name="dt"></param>
/// <param name="tn"></param>
/// <param name="parentid"></param>
public void CreateNode(DataTable dt,TreeNode tn, string parentid)
{
DataRow[] drs;
if (parentid != " 000000 " )
parentid
= parentid.TrimEnd( ' 0 ' );//这里使用了一个技巧.
if (parentid == " 000000 " )
{
drs
= dt.Select( " bianma like '%000000' " ); // 顶层
}
else
{
drs
= dt.Select(String.Format( " bianma like '{0}%' " , parentid));
}

if (drs.Length < 1 )
return ;

foreach (DataRow dr in drs)
{
string p = dr[ " bianma " ].ToString();
if ( ! Code.Contains(p))
{
Code.Add(p);
TreeNode tntemp
= new TreeNode();
tntemp.Text
= dr[ " mingcheng " ].ToString();
tntemp.Value
= p;
CreateNode(dt, tntemp, p);
tn.ChildNodes.Add(tntemp);
}
}

}

转载于:https://www.cnblogs.com/handk/archive/2010/12/02/1894016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值