希望高手能够递归的写出一段以GUID为主键的树形结构 能够动态删除 增加节点 拜托了 小弟解决不了了 不是INT类型!
数据库的表我暂时不提供 写出例子 我琢磨下!

解决方案 »

  1.   

    不是int类型的?
    只能表示关注了
      

  2.   

    GUID为主键的树形结构???表这样设计:
    GUID  NodeID PNodeID NodeContent NavigateUrl
    只要使用NodeID和PNodeID进行递归不可以嘛,很多这样的例子嘛
      

  3.   

    递归实现treeview动态添加节点protected void addtreview()
        {
            SqlConnection myconn = new SqlConnection();
            myconn.ConnectionString = "server=.;database=baoming;uid=sa;pwd=admin";
            myconn.Open();  //连接数据库
            SqlDataAdapter sda = new SqlDataAdapter("select * from treeview where tree_class = 1", myconn); //读取根节点数据
            DataSet ds = new DataSet();
            sda.Fill(ds);       
            for (int i = 0;i<ds.Tables[0].Rows.Count;i++)   //遍历根节点数量
            {
                SqlDataAdapter sda2 = new SqlDataAdapter("select * from treeview where tree_lei = '" + ds.Tables[0].Rows[i]["tree_id"].ToString() + "'", myconn);   //读取子节点数据
                DataSet ds2 = new DataSet();
                sda2.Fill(ds2);
                TreeNode node = new TreeNode();
                node.Text = ds.Tables[0].Rows[i]["tree_name"].ToString();   //填充根节点数据                     
                for (int j = 0; j < ds2.Tables[0].Rows.Count; j++)  //遍历第一级子结点数量
                {
                    TreeNode newnode = new TreeNode();
                    newnode.Text = ds2.Tables[0].Rows[j]["tree_name"].ToString();   //填充子节点数据
                    newnode.NavigateUrl = ds2.Tables[0].Rows[j]["tree_url"].ToString();
                    node.ChildNodes.Add(newnode);  //将子节点添加到父节点下              
                }            
                TreeView2.Nodes.Add(node);  //填充treeview
            }
            myconn.Close();
        } 
      

  4.   

    只要使用NodeID和PNodeID进行递归就可以了。我的主键是就是用的guid
      

  5.   

    主键是GUID类型的表,一般情况下都再增加个identity列。
      

  6.   

    楼主,树当然对int比较敏感可以用表结构把int和guid映射一下这样也可以达到关联嘛
      

  7.   

    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"]);
                }
            }
    参考
      

  8.   

    使用游标或者使用
     while @rowcount!=0
     内连接求子节点

    具体我也忘记了
      

  9.   


    - - 你们谁做做好事 自己试一下贴代码我看看  字段暂时给你们folderid foldername paretid 
    2个ID都是GUID 类型 pID默认null(根节点)
      

  10.   


    create table cate
    (
    folderid uniqueidentifier not null,
    foldername nvarchar(80),
    paretid uniqueidentifier
    )declare @a1 uniqueidentifier, @a2 uniqueidentifier, @a3 uniqueidentifier
    set @a1 = NEWID()
    set @a2 = NEWID()
    set @a3 = NEWID()insert into cate select @a1,' 部门1',null union all
    select @a2,' 部门2',null union all
    select @a3,' 部门3',null union all
    select NEWID(),' 部门1-1',@a1 union all
    select NEWID(),' 部门1-2',@a1 union all
    select NEWID(),' 部门2-1',@a2 union all
    select NEWID(),' 部门2-2',@a2 union all
    select NEWID(),' 部门3-1',@a3 union all
    select NEWID(),' 部门3-2',@a3    private DataTable dt;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                dt = GetTree();
                ForEachTree(null);
            }
        }    protected void ForEachTree(TreeNode prevNode)
        {
            DataView dv = dt.DefaultView;
            dv.RowFilter = prevNode == null ? "paretid is null" : "paretid = '" + prevNode.Value + "'";
            foreach (DataRowView item in dv)
            {
                TreeNode tn = new TreeNode();
                tn.Text = item["foldername"].ToString();
                tn.Value = item["folderid"].ToString();
                if (prevNode == null)
                {
                    TreeView1.Nodes.Add(tn);
                }
                else
                {
                    prevNode.ChildNodes.Add(tn);
                }
                ForEachTree(tn);
            }
        }    protected DataTable GetTree()
        {
            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection("server=.;user id=sa;pwd=111;database=master;"))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("select * from cate", conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            return dt;
        }
      

  11.   

    以上实例可以直接运行调试还有你的动态添加删除,是什么样子的??如果要在每个节点文本后面 跟 ‘添加’‘删除’,可以这样将上面代码的
     tn.Text = item["foldername"].ToString();
    修改为
    tn.Text = string.Format("{0} <a href=javascript:add('{1}')>添加</a> <a href=javascript:del('{1}')>删除</a>", item["foldername"].ToString(), item["folderid"].ToString());即调用两个js方法,然后编写js方法,以ajax的方式来操作,后续操作你自己实践一下
      

  12.   

    对了  你这个是用了treeview控件的吧 如果不用控件呢?
      

  13.   

    用了TreeView控件,不用控件的话,将那个递归里面涉及到TreeView的代码,替换成 格式字符串的等,你可以拼凑下HTML代码,然后前台用js美化