数据库结构:
id pid beizhu
1    0  aaa
2    1  aaa1
3    1  aaa2
4    2  aaa1-1
5    4  aaa1-1-1 部分代码如下(实现了递归加载好树) #region 实现添加节点的方法
    public void addnodes()//添加树的根节点
    {
        ds = this.DBAdataset();//获取数据库的数据
        if (ds.Tables[0].Rows.Count > 0)
        {
            TreeNode n = null;
            for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
            {
                //string[] pic = (string[])arr[i];
                if (ds.Tables[0].Rows[i][1].ToString().Equals("0"))//当上级id是0为根节点
                {                    n = new TreeNode();
                    n.Text = ds.Tables[0].Rows[i][2].ToString();
                    treeView1.Nodes.Add(n);
                    n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
                    n.ShowCheckBox = true;
                    //n.Checked = aTreeNode.DefaultStatus;
                    n.Expanded = n.Checked;
                    //n.Tag = pic[0];
                    //n.ImageIndex = 0;
                    //n.SelectedImageIndex = 0;               
                    this.addnode1(n); //添加子节点              
                }
            }
            
        }
    }
    public void addnode1(TreeNode N)//添加树的所有子节点
    {
        TreeNode n = null;
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            if (N.Value.Equals(ds.Tables[0].Rows[i][1].ToString()))
            {
                n = new TreeNode();
                n.Text = ds.Tables[0].Rows[i][2].ToString();
                N.ChildNodes.Add(n);
                n.Value = ds.Tables[0].Rows[i][0].ToString();//存储当前节点ID
                n.ShowCheckBox = true;
                //n.Checked = aTreeNode.DefaultStatus;
                n.Expanded = n.Checked;
                this.addnode1(n);
            }        }
    }
   #endregion   我单击树节点的时候获得了树的ID和PID,页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树,都没有问题,唯一不爽的就是树会回到初始状态,需要从新点击“+”才能看见,我现在想让树重新加载后保持原来的展开样子(当然新加的节点一定要显示出来)因为我的TREEVIEW控件是放在UpdatePanel里的,所以页面上不会看出刷新效果,请各位大虾给点详细代码,谢谢。
基本原来我在网上看见了是这样
1、把当前树中选中节点记录下来
2、重新加载树后,遍历所有节点,找到记录下来的节点
3、找到后,设为选中,展开节点即可。
代码如下//用来存储选中节点
TreeNode ChecedkNode=new TreeNode();//当前选中节点传给它
CheckedNode=treeView1.SelectedNode;//递归函数遍历所有节点,找出并选中,展开
 void test(TreeNode node1) 
      {
            foreach (TreeNode node in node1.Nodes)
           {                
                if(node.Text==CheckedNode.Text)
              {
                    this.treeView1.SelectedNode = node;
                    treeView1.SelectedNode.Expand();
                }   
                test(node);
            }          
        }//调用刚才递归并传参,保证所有节点被遍历
foreach (TreeNode node in this.treeView1.Nodes)
          {
                test(node);  
            }
可这代码说得不够详细呀,不知道具体放到哪个位置。

解决方案 »

  1.   

    你试试吧treeview 放在updatepanel里,
    然后把treeview添加到updatepanel的PostBackTrigger属性里。
      

  2.   

    重新加载的时候:
    treeView1.ExpandAll();这样不就全部展开了吗?
      

  3.   

    重新加载的时候:
    treeView1.ExpandAll();这样不就全部展开了吗?
      

  4.   

    放入根节点下就可以了public void addnodes()//添加树的根节点
      

  5.   

    //用来存储选中节点
    TreeNode ChecedkNode=new TreeNode();
    //当前选中节点传给它
    CheckedNode=treeView1.SelectedNode;
    //递归函数遍历所有节点,找出并选中,展开        [align=left]    foreach (TreeNode node in 该Node的上级.Nodes)
               {                
                    if(node.Text==CheckedNode.Text)
                  {
                        this.treeView1.SelectedNode = node;
                        treeView1.SelectedNode.Expand();
                    }   
                    test(node);
                }          [/align]
    你贴出来的这段代码就可以实现了啊,先把你点击的node记下来,提交后在这个node上级node里边循环找,找到text相同的就把node赋给treeview1.SelectedNode,然后展开这个Node。
      

  6.   

    页面上放一提交按钮,根据ID和PID插入添加的节点到数据库后然后重新加载树
    在你提交后写入数据库,然后查询重新加载树的后边啊!
      

  7.   

    我试过 不行啊   foreach (TreeNode node in 该Node的上级.Nodes) 
    的。nodes点不出来//用来存储选中节点 
    TreeNode ChecedkNode=new TreeNode();这句的位置也是个问题 定义成全局也要报错
      

  8.   

    treeview里有个path,是不是你需要的?或者你可以保存节点的node到参数,然后selectednode=younode;不就可以定位到你刚才选择的吗?
      

  9.   

    根据传来的记录ID再用递归遍历的话,速度会很慢的这个问题我也没有解决,因为太慢了,客户肯定接受不了给你代码参考一个:    #region 根据传来的ID和层次,展开到指定的节点
        /// <summary>
        /// 根据传来的ID和层次,展开到指定的节点
        /// Author:liuqj
        /// DATE:2008-5-12
        /// </summary>
        /// <param name="tnc">节点集合</param>
        /// <param name="id">节点的value</param>
        /// <param name="depth">节点的深度</param>
        private void FondNode(TreeNodeCollection tnc, string id, int depth)
        {
            foreach (TreeNode tn in tnc)
            {
                if (tn.Value == id && tn.Depth == depth - 1)
                {
                    tn.Select();
                    //this.ExpandNode(tn);
                    ExpandNode(tn);
                    break;
                }
                else
                    this.FondNode(tn.ChildNodes, id, depth);
            }
        }
        /// <summary>
        /// 将选择的节点的所有父节点展开
        /// </summary>
        /// <param name="tn"></param>
        private void ExpandNode(TreeNode tn)
        {
            while (tn.Parent is TreeNode) //将选择的节点的所有父节点展开 
            {
                tn.Parent.Expanded = true;
                tn = tn.Parent;
            }
        }
        #endregion