我有一个TreeView控件放在母版页,其供它页面应用.
如何实现:
在一个页面中点击TreeView一个节点后转到新的页面,
在新的页面里展开的还是上次页面时选择的节点!!!

解决方案 »

  1.   

    状态需要自己维护,将选中的节点编号(或者标示)放到Session(或者DB)里面,下次载入页面的时候,从该Session(或者DB)中获得选中的项即可。
      

  2.   

    cuike519 :能给出具体的代码吗?急!!!
      

  3.   

    你点击的url里面是不是带一个新的页面的参数的阿
    根据这个参数能够反推出去 是那个节点点击的?可以的话就把这个节点的父结点Expanded属性设置一下,点击的节点的属性设置一下就好了阿
      

  4.   

     hy_lihuan:谢谢提醒,按你的提示,代码如下,但第二行IndexOf老是有问题,请高手指教!!!!!!
    private void ExpandTree()
       {
           if (Request.QueryString["tyepid"] != null)
           {
               int indexof =Convert.ToInt32( Request.QueryString["typeid"]);//根据url获取typeid
               
               NewsTreeView.SelectedNode =NewsTreeView.Nodes.IndexOf(NewsTreeView.SelectedValue[indexof]);//这行有问题
               
               TreeNode stn = NewsTreeView.SelectedNode; //展开选择的节点
               stn.Expanded = true;           while (stn.Parent is TreeNode) //将选择的节点的所有父节点展开
               {
                   stn.Parent.Expanded=true;
                   stn=tn.Parent;
               }
           }
           else
               return;
       }
      

  5.   

    NewsTreeView.SelectedNode   =NewsTreeView.Nodes.IndexOf(NewsTreeView.SelectedValue[indexof]);//
    不知道你为什么要这样写来展开节点
    节点实例没有selected属性?
    应该是selected属性=true这样来展开节点吧....
      

  6.   

    楼主是是不是想实现例如到新页面后TreeView的展开状态保持不变。也就是说展开的节点依然展开,收缩的节点依然收缩?如果是这样的话,可以把状态值保存在Session。我原来的做法是吧所有节点的状态保存在Session中,然后再新页面里去遍历TreeView设置状态
      

  7.   

    楼上,是这个意思,我想问一下,什么时机保存,什么时机又恢复?
    代码如下:
    using System;using System.Collections.Generic;using System.Web;using System.Web.UI.WebControls; public class TreeViewState{    public void SaveTreeView(TreeView treeView, string key)    {        List<bool?> list = new List<bool?>();        SaveTreeViewExpandedState(treeView.Nodes, list);        HttpContext.Current.Session[key + treeView.ID] = list;    }     private int RestoreTreeViewIndex;     public void RestoreTreeView(TreeView treeView, string key)    {        RestoreTreeViewIndex = 0;        RestoreTreeViewExpandedState(treeView.Nodes,            (List<bool?>)HttpContext.Current.Session[key + treeView.ID] ?? new List<bool?>());    }     private void SaveTreeViewExpandedState(TreeNodeCollection nodes, List<bool?> list)    {        foreach (TreeNode node in nodes)        {            list.Add(node.Expanded);            if (node.ChildNodes.Count > 0)            {                SaveTreeViewExpandedState(node.ChildNodes, list);            }        }    }     private void RestoreTreeViewExpandedState(TreeNodeCollection nodes, List<bool?> list)    {        foreach (TreeNode node in nodes)        {            if (RestoreTreeViewIndex >= list.Count) break;             node.Expanded = list[RestoreTreeViewIndex++];            if (node.ChildNodes.Count > 0)            {                RestoreTreeViewExpandedState(node.ChildNodes, list);            }        }    }}
    --------------------------------
    master页面:PutNews.CategoryDataTable dt;//强类型的DataTableprotected void TreeViewMain_Unload(object sender, EventArgs e)
        {
            // save the state of all nodes.
            new TreeViewState().SaveTreeView(TreeViewMain, this.GetType().ToString());
        }protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                CategoryBLL cb = new CategoryBLL();
                dt = cb.GetCategory();//过滤ParentID,得到当前的所有子节点
                AddTree(0, (TreeNode)null);
                new TreeViewState().RestoreTreeView(TreeViewMain, this.GetType().ToString());
            }
        }
    // 递归添加树的节点
        private void AddTree(int ParentID, TreeNode pNode)
        {
     ...........方法略
    }
    调试发现TreeViewState().SaveTreeView方法中list保存的Expansion / Collapse 状态全是null
      

  8.   


      protected void Page_Load(object sender, EventArgs e)
        {
            StateSave();//保存原来状态
            BindCategoryTreeVew(this.TreeView1);//重新生成树
            StateSet();//设置原来状态
        }
      

  9.   

    当然,我这里和你有点不同的是,我是做在框架页面中,在同一页面。因此我的状态时保存在ViewSate里面。你的这个个需要用Session保存。StateSave();//保存原来状态这个步骤就需要你在前一个页面没跳转之前执行吧