asp.net treeview递归写法(详细!!!)

来源:互联网 发布:java httpheaders 编辑:程序博客网 时间:2024/06/05 10:41
最近在写一个treeview,参考了网上很多种写法,终于总结出自己treeview的写法了!!分享给大家。
假设数据库表:
Table-------
id     name       fatherid
1      a           0
2      b           1
3      c           1
4      d           2
5      e           3
.
.
.
asp页面添加的treeview名称为TreeVieww1,绑定数据库后得到的DataTable名称为dt,需要在treeview中绑定的节点Text为"name",Node为"id",
父节点id为"fatherid",
那么在asp页面可以这样写
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //获取填充树所需要的DataTable
            DataTable dt = dtAdapter.GetClass();
            //填充树
            newtree.AddTree(dt,TreeView1,"name","id","005000000000", (TreeNode)null);
        }
    }
其中"005000000000"是我指派给根节点的id(我设置id/fatherid为string类型的),"(TreeNode)null"为设置初始节点的TreeNode为空。下面的方法,
可以放在工程的任何位置,达到重用的目的。
 //递归添加树的节点 
        public void AddTree(DataTable dt, TreeView tv, string NodeText, string NewNode, string FatherID, TreeNode pNode)
        {
            DataView dvTree = new DataView(dt);
            //过滤FatherID,得到当前的所有子节点  
            dvTree.RowFilter = "fatherid=" + FatherID;
            foreach (DataRowView Row in dvTree)
            {
                TreeNode Node = new TreeNode();
                if (pNode == null)
                {         //添加根节点  
                    Node.Text = Row[NodeText].ToString();
                    tv.Nodes.Add(Node);
                    Node.Expanded = true;
                    AddTree(dt, tv, NodeText, NewNode, Row[NewNode].ToString(), Node);         //再次递归  
                }
                else
                {       //添加当前节点的子节点  
                    Node.Text = Row[NodeText].ToString().ToString();
                    pNode.ChildNodes.Add(Node);
                    Node.Expanded = true;
                    AddTree(dt, tv, NodeText, NewNode, Row[NewNode].ToString(), Node);         //再次递归  
                }
            }
        }
 
************************************************************************************
 //获取当前节点路径 text>>输入需要获取的节点名称,此函数返回该节点路径
    static string valuePath = null;
    public string SearchNode(TreeNodeCollection tnds, string text)
    {
        foreach (TreeNode tnd in tnds)
        {
            if (tnd.Text == text)
            {
                if (valuePath == null)
                valuePath= tnd.ValuePath.ToString();
            }
            else
            {
                if (tnd.ChildNodes.Count != 0)
                {
                    SearchNode(tnd.ChildNodes, text);
                }
            }
        }
        return valuePath;
    }
***********************************************************************************
    //获取当前节点的子节点 mynode>>当前节点;nodepath>>当前节点的路径
    public void printtree(TreeNode mynode,string NodePath)
    {
        if(NodePath!=mynode.ValuePath)
        Response.Write(mynode.Value.ToString() + "  ");
        NodePath = null;//将路径值归0,不显示当前节点,如果获取的节点要包括当前节点,将样式的两行去掉
        if (mynode.ChildNodes.Count != 0)
        {
            foreach (TreeNode tempnode in mynode.ChildNodes)
            {
                printtree(tempnode, NodePath);
            }
        }
    }
 
原创粉丝点击