昨天在网上一个网友帮忙让实现一个树的程序,表结构为:
效果图:
看到表结构很汗颜,抛开字段的命名方式不说,实际开发中生成树一般会加一个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);
}
}
}