pid                    name               ppid
 iii                     父1               root
 iii.dd                  子1                iii
 iii.aa                  子2                iii
 iii.dd.d1                叶1             iii.dd
iii.aa.a1               叶2                iii.aa
效果是
iii
  iii.dd
    iii.dd.d1
  iii.aa
    iii.aa.a1

解决方案 »

  1.   

    private void InitTree(TreeNodeCollection Nds,int parentid)
            {
                DataView dv = new DataView();
                TreeNode tmpNd = null;
                dv.Table = ds.Tables[0];
                dv.RowFilter = String.Format("parentid={0}", parentid);
                foreach (DataRowView drv in dv)
                {
                    tmpNd = new TreeNode();
                    tmpNd.Text = (string)drv["sortname"];//节点名称
                    tmpNd.NavigateUrl = String.Format("?id={0}", drv["id"]);//节点URL
                    //tmpNd.ImageUrl = ""; //节点图片
                    if (parentid == 0)
                        tmpNd.Expanded = true;
                    else
                        tmpNd.Expanded = false;
                    Nds.Add(tmpNd);
                    InitTree(Nds[Nds.Count - 1].ChildNodes, (int)drv["id"]);
                }
            }
    参考
      

  2.   

    我这张表 没有 int 的 字段  全是 varchar型 的  在 百度  找了N多  改了都是 报错  就是  递归不出想要的效果
      

  3.   

    简单的递归,肯定是你写的递归方法有问题,递归和int 的 字段没有关系
      

  4.   

    其实不改int字段也没啥问题啊。
      

  5.   

    试试
    private void InitTree(TreeNodeCollection Nds,string ppid)
            {
                DataView dv = new DataView();
                TreeNode tmpNd = null;
                dv.Table = ds.Tables[0];
                dv.RowFilter = String.Format("ppid='{0}'", parentid);
                foreach (DataRowView drv in dv)
                {
                    tmpNd = new TreeNode();
                    tmpNd.Text = (string)drv["pid"];//节点名称
                    if(tmpNd.Text=="iii"){
                       break;
                     }
               
                    Nds.Add(tmpNd);
                    InitTree(Nds[Nds.Count - 1].ChildNodes, (String)drv["ppid"]);
                }
            }
      

  6.   

    InitTree(这里传什么,string ppid)
      

  7.   

            <asp:TreeView ID="TreeView1" runat="server">
            </asp:TreeView>
        protected void Page_Load(object sender, EventArgs e)
        {
            GetTable();
            GetValue("root", null);
        }
        public void GetTable()
        {
            using (SqlConnection conn = new SqlConnection())
            {
                conn.ConnectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
                string str = "select id,name,parentid from ceshi";
                SqlDataAdapter da = new SqlDataAdapter(str, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                ViewState["Table"] = dt;
            }
        }
        public void GetValue(string parentid,TreeNode node)
        {
            DataView dv = new DataView(ViewState["Table"] as DataTable);
            dv.RowFilter = "parentid='" + parentid + "'";
            foreach (DataRowView rowview in dv)
            {
                TreeNode n = new TreeNode(rowview["id"].ToString(), rowview["id"].ToString());
                if (node == null)
                    TreeView1.Nodes.Add(n);
                else
                    node.ChildNodes.Add(n);
                GetValue(rowview["id"].ToString(), n);
            }
        }
      

  8.   

    你要写二个方法,
    1.通过固定的父Id也就是root查询出所有的Id
    2.通过第一个方法查询出的对象的Id与父Id对比查询出所有子节点
    你应该有二个foreach循环
    第一个循环1方法查询出的所有根节点
    再用根据节点的Id做参数传入第二个方法中.将查询出来的结果再循环
    在循环的最后再调用此方法InitTree