C#树视图状态扩展
我的主页上有一个树状视图。加载contentpage时,我希望保存treeview状态(折叠/展开哪些节点)。我将节点存储在ArrayList中。代码:C#树视图状态扩展,c#,asp.net,treeview,C#,Asp.net,Treeview,我的主页上有一个树状视图。加载contentpage时,我希望保存treeview状态(折叠/展开哪些节点)。我将节点存储在ArrayList中。代码: private void SaveTreeviewState(TreeNodeCollection nodes) { foreach (TreeNode t in nodes) { // Store expandable state in ArrayList (true or false) //N
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对象的卸载事件调用:
protected void tvManual_Unload(object sender, EventArgs e)
{
SaveTreeviewState(tvManual.Nodes);
// Clear session
Session["Treeview"] = null;
// Add arraylistm to session
Session["Treeview"] = NodePaths;
}
在母版页的加载事件中,我检查会话是否已设置。设置会话后,我调用读取会话的方法
会话中的arraylist包含所有my节点,因此这是正确的。但是,所有节点的扩展属性都设置为false。这是不正确的,因为我扩展了多个节点
希望你们能理解我的问题,帮我解决
Thnx在advanced中因为保存的列表实际上是一个对象列表(TreeNode对象),所以您实际上是在存储对对象的引用。我猜在TVU上,扩展状态正在改变或类似的事情。您可能正在使用进程内会话,这类似于对对象进行引用(没有序列化),因此对对象属性的任何更改对存储在会话中的对象也是可见的
通过将值存储到会话中,可以避免这种副作用。例如,存储一个字典,其中键将包含节点路径,值将包含展开状态 我现在存储值而不是对象:NodePaths.Add(t.Expanded);这没用。所有的值都是假的。当您使用NodePath.add(t.Expanded)添加值时,您确定这些值是正确的吗?如果它们是值类型,那么一旦存储在会话中就要更改它们是没有意义的。正确的值是什么意思?当我在母版页上展开treenodes时,我知道expanded必须为true。但是如果您打印(或在调试器中看到)所有值,而实际将它们与NodePath一起存储。Add(t.expanded)是否正确?(你期望的那样扩展是真的吗?)不,这是我的问题。默认情况下,我的树视图是折叠的。当我展开一些节点并触发卸载事件时,所有节点的“展开”属性都设置为false。所以我的数组节点路径只包含假值。。。