asp.net2.0中关于TreeView 状态的问题 我有一个TreeView控件放在母版页,其供它页面应用.如何实现:在一个页面中点击TreeView一个节点后转到新的页面,在新的页面里展开的还是上次页面时选择的节点!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 状态需要自己维护,将选中的节点编号(或者标示)放到Session(或者DB)里面,下次载入页面的时候,从该Session(或者DB)中获得选中的项即可。 cuike519 :能给出具体的代码吗?急!!! 你点击的url里面是不是带一个新的页面的参数的阿根据这个参数能够反推出去 是那个节点点击的?可以的话就把这个节点的父结点Expanded属性设置一下,点击的节点的属性设置一下就好了阿 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; } NewsTreeView.SelectedNode =NewsTreeView.Nodes.IndexOf(NewsTreeView.SelectedValue[indexof]);//不知道你为什么要这样写来展开节点节点实例没有selected属性?应该是selected属性=true这样来展开节点吧.... 楼主是是不是想实现例如到新页面后TreeView的展开状态保持不变。也就是说展开的节点依然展开,收缩的节点依然收缩?如果是这样的话,可以把状态值保存在Session。我原来的做法是吧所有节点的状态保存在Session中,然后再新页面里去遍历TreeView设置状态 楼上,是这个意思,我想问一下,什么时机保存,什么时机又恢复?代码如下: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 protected void Page_Load(object sender, EventArgs e) { StateSave();//保存原来状态 BindCategoryTreeVew(this.TreeView1);//重新生成树 StateSet();//设置原来状态 } 当然,我这里和你有点不同的是,我是做在框架页面中,在同一页面。因此我的状态时保存在ViewSate里面。你的这个个需要用Session保存。StateSave();//保存原来状态这个步骤就需要你在前一个页面没跳转之前执行吧 效果显示方法 求救》。。。 用.NET发布地图 DataList动态创建模板的问题 图片 !!!加急,加急 !!! 调用共用函数问题:怎么实现类似<!--#include file="xxx.inc" -->的功能 误删AjaxExtensions选项卡,请问如何恢复? 偶尔出现Invalid operation. The connection is closed.这种错误,求解 关于事务处理问题 水晶报表问题 ASP.net上传文件并显示进度条如何实现! 求教,一个简单的http请求响应场景的编程
根据这个参数能够反推出去 是那个节点点击的?可以的话就把这个节点的父结点Expanded属性设置一下,点击的节点的属性设置一下就好了阿
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;
}
不知道你为什么要这样写来展开节点
节点实例没有selected属性?
应该是selected属性=true这样来展开节点吧....
代码如下:
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
protected void Page_Load(object sender, EventArgs e)
{
StateSave();//保存原来状态
BindCategoryTreeVew(this.TreeView1);//重新生成树
StateSet();//设置原来状态
}