当前位置:编程学习 > C#/ASP.NET >>

asp.net中treeview递归绑定数据库字段

比如说我的数据库TB_myBM表中有这么几个字段 
  id(int自动增长的)                     name(varchar)                         varid(varchr) 
      1                                   部门                                     001               
      2                                   技术部                                 001001 
      3                                   市场部                                 001002 
      4                                   技术1部                               001001001 
      5                                   技术2部                               001001002 
      6                                   技术3部                               001001003 
      7                                   市场1部                               001002001 
      8                                   市场2部                               001002002 
      9                                   市场3部                               001002003 
      10                                  技术1部1小分部                        001001001001
      11                                  技术1部2小分部                        001001001002
   
  
怎么用treeview递归树形绑定达到下面的效果: 
部门 
      技术部 
              技术1部
                     技术1部1小分部
                     技术1部2小分部
              技术2部 
              技术3部 
      市场部 
              市场1部 
              市场2部 
              市场3部 

麻烦各位说清楚点带上后台代码,在此谢谢 
--------------------编程问答-------------------- private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv=new DataView();
TreeNode tmpNd;
string intId;
dv.Table=ds.Tables["tree"];
dv.RowFilter="ParentId='" + parentId + "'" ;
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
tmpNd.Tag=drv["NodeId"].ToString();
tmpNd.Text=drv["NodeName"].ToString();
Nds.Add(tmpNd);
intId=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.Tag.ToString());
}

charindex和根据深度判断varid长度 --------------------编程问答-------------------- 其实递归绑定很简单,想你这样的数据没有必要再前台做,可以在数据库中先把数据递归了 直接返回给前台调用就好了!



    WITH locs(ArticleReplyId,ParentId,ParentUserName,UserId,ArticleTitle,loclevel)
    AS
    (
        SELECT ArticleReplyId,ParentId,ParentUserName,UserId,ArticleTitle,0 AS loclevel FROM ArticleReply_tb
        WHERE ParentId is null
        UNION ALL
        SELECT l.ArticleReplyId,l.ParentId,l.ParentUserName,l.UserId,l.ArticleTitle,loclevel+1 FROM ArticleReply_tb l 
            INNER JOIN locs p ON l.ParentId=p.UserId
    )
 
    SELECT * FROM locs

这个是我以前写的递归取数据的方法, 你可以更具你自己的表修改,只适用于SQL SERVER2005或者以上版本! --------------------编程问答-------------------- SQL Result
NodeID      NodeName       NodeUrl           ParentNodeID
----------- ---------- -------------------- ------------
1           主面板         main.aspx            0
2           服务器信息     serverList.aspx      0
3           用户信息       usersList.aspx       0
4           发布服务       addServer.aspx       2
5           增加用户       addUser.aspx         3
(5 行受影响)
---------------------------------------------------------

/// <summary>
    /// 生成树形控件
    /// </summary>
    private void CreateTree()
    {
//先获取ParentNodeID为0的数据对象集合,这里称为父节点
//GetFaterNodes();是获取父节点的方法 [slelec * from NodeLink where ParentNodeID=0]
        List<NodeLink> nodesParent = ServerInfoManage.GetFaterNodes();//楼主,对比上面的数据列

        foreach (NodeLink PNode in nodesParent)//遍历父节点集合
        {
            TreeNode PTree = new TreeNode();
            PTree.Text = PNode.NodeName;
            PTree.NavigateUrl = PNode.NodeUrl;
            
           //获取父节点下的子节点
   //GetSubNodesByNID方法是获取子节点的方法[select * from NodeLink where NodeID=@PNode.NodeID]
            List<NodeLink> subNodes = ServerInfoManage.GetSubNodesByNID(PNode.NodeID);//注意参数

            foreach (NodeLink subNode in subNodes)//遍历子节点集合,并添加到父节点
            {
                TreeNode subTree = new TreeNode();
                subTree.Text = subNode.NodeName;
                subTree.NavigateUrl = subNode.NodeUrl;
                PTree.ChildNodes.Add(subTree);
            }
            tvUrls.Nodes.Add(PTree);//把父节点添加到树形控件[tvUrls]中
        }
    }
--------------------编程问答-------------------- 间隔有问题,我弄了下!
SQL Result
NodeID       NodeName       NodeUrl          ParentNodeID
----------- ---------- -------------------- ------------
1            主面板         main.aspx            0
2            服务器信息     serverList.aspx      0
3            用户信息       usersList.aspx       0
4            发布服务       addServer.aspx       2
5            增加用户       addUser.aspx         3
(5 行受影响)
--------------------------------------------------------- --------------------编程问答-------------------- 怎么解决啊,好像没有说清楚啊! --------------------编程问答--------------------
引用 5 楼 lianjianguo888 的回复:
怎么解决啊,好像没有说清楚啊!

对啊 --------------------编程问答--------------------

 private void bind()
    {
        string temp = "<ul class='simpleTree'>";
        DataSet ds = db.getDs();
        DataRow[] dr = ds.Tables[0].Select("department_code='001'");
        Response.Write("为了测试,当前总行数为:" + "<a style='color=red'>"+ds.Tables[0].Rows.Count+"</a><div style='height=10px;background-color:white'></div>");
        
        foreach (DataRow r in dr)
        {
            string name = r["department_name"].ToString();
            string code = r["department_code"].ToString();
            temp += "<li class='root' id='li1' name='" + name + "'><span id='s1' oncontextmenu = showMenu('" + i + "')  name='" + name + "' class='" + code + "'>" + name + "</span>";
            if (AddChildNode(ds, code) != "" || AddChildNode(ds, code)!=null)
             {
                 temp += "<ul>" + AddChildNode(ds, code);
                 ds.Tables[0].Rows.Remove(r);

             }
            
        }

         
        temp += "</ul>";
      
        mytree.InnerHtml = temp;
      
    }

    public string AddChildNode(DataSet ds, string department_code)
    {
        i++;

        string a = "";
        DataRow[] dr = ds.Tables[0].Select("parent_department='" + department_code + "'");
        int count = dr.Length;

        if (dr != null)
        {

            foreach (DataRow r in dr)
            {


                string code = r["department_code"].ToString();

                string name = r["department_name"].ToString();
                a += "<li id='li" + i + "' class='" + code + "' name='" + name + "'><span id='s" + i + "' oncontextmenu = showMenu('" + i + "') name='" + name + "' class='" + code + "'>" + name + "</span></li>";
                if (AddChildNode(ds, code) == "" || AddChildNode(ds, code) == null)
                {

                }
                else
                {
                    a += "<ul>" + AddChildNode(ds, code) + "</ul>";
                     
                }
                 

            }

        }
         
        return a;
    }
    
    
--------------------编程问答-------------------- 有点模糊啊 --------------------编程问答--------------------
 private void Bind(TreeNode parent)
    {
        DataTable dt = get();
        if (parent != null)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["d_id"].ToString().IndexOf(parent.Value) == 0&&!dt.Rows[i]["d_id"].ToString().Equals(parent.Value)&&dt.Rows[i]["d_id"].ToString().Length==parent.Value.Length+3)
                { 
                    TreeNode tn=new TreeNode();
                    
                    tn.Text=dt.Rows[i]["d_name"].ToString();
                    tn.Value = dt.Rows[i]["d_id"].ToString();
                    parent.ChildNodes.Add(tn);
                    Bind(tn);
                }
            }
        }
        else
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["d_id"].ToString().Length == 3)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dt.Rows[i]["d_name"].ToString();
                    tn.Value =dt.Rows[i]["d_id"].ToString();
                    TreeView1.Nodes.Add(tn);
                    Bind(tn);
                }
            }
        }
        
    }

Bind(null); --------------------编程问答-------------------- 总是头疼这个,但是总是不想弄懂,很烦人,学习。 --------------------编程问答-------------------- 简单点的其实就是从数据库中找出父节点,然后再遍历父节点的foreach中遍历子节点,添加到树中 --------------------编程问答-------------------- 简单点的其实就是从数据库中找出父节点,然后再遍历父节点的foreach中遍历子节点,添加到树中 --------------------编程问答-------------------- --------------------编程问答-------------------- 叫我qq我发给你个例子 --------------------编程问答-------------------- 楼主  我也想要啊  我是新手 也不会啊 --------------------编程问答--------------------
引用 1 楼 wuyq11 的回复:
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv=new DataView();
TreeNode tmpNd;
string intId;
dv.Table=ds.Tables["tree"];
dv.RowFilter="ParentId='" + parentId + "'" ;……

这个方法可行,也可以现出来父节点,点击父节点在显示子节点。 --------------------编程问答-------------------- 我也不会啊
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,