我的主页上有一个树视图。加载内容页面时,我想保存树视图状态(折叠/展开哪些节点)。我将节点存储在ArrayList中。代码:
private void SaveTreeviewState(TreeNodeCollection nodes)
{
foreach (TreeNode t in nodes)
{
// Store expandable state in ArrayList (true or false)
//NodePaths.Add(t.Expanded);
NodePaths.Add(t);
// Check for childnods
if (t.ChildNodes.Count > 0)
// recall this method
SaveTreeviewState(t.ChildNodes);
}
}
此方法由treeview对象的unload事件调用:
protected void tvManual_Unload(object sender, EventArgs e)
{
SaveTreeviewState(tvManual.Nodes);
// Clear session
Session["Treeview"] = null;
// Add arraylistm to session
Session["Treeview"] = NodePaths;
}
在母版页的加载事件中,我检查我的会话是否已设置。设置会话时,我调用读取会话的方法。
会话中的arraylist包含我的所有节点,所以这是正确的。但是,所有节点都将属性扩展设置为false。这是不正确的,因为我扩展了mupliple节点。
希望你们能理解我的问题并帮助我。
先进的Thnx
答案 0 :(得分:1)
因为保存的列表实际上是一个对象列表(TreeNode对象),所以实际上是存储对象的引用。我猜测在tvManual_Unload上扩展状态正在改变或类似的东西。可能您正在使用inprocess会话,这类似于对对象的引用(没有序列化),因此对象属性的任何更改对于存储在会话中的对象也是可见的。
您可以通过将值存储到会话中来避免此类副作用。例如,存储一个Dictionary< string,bool>密钥将包含节点路径,值将包含展开状态。