C#Treeview状态扩大了

时间:2009-02-05 14:46:34

标签: c# asp.net treeview

我的主页上有一个树视图。加载内容页面时,我想保存树视图状态(折叠/展开哪些节点)。我将节点存储在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

1 个答案:

答案 0 :(得分:1)

因为保存的列表实际上是一个对象列表(TreeNode对象),所以实际上是存储对象的引用。我猜测在tvManual_Unload上扩展状态正在改变或类似的东西。可能您正在使用inprocess会话,这类似于对对象的引用(没有序列化),因此对象属性的任何更改对于存储在会话中的对象也是可见的。

您可以通过将值存储到会话中来避免此类副作用。例如,存储一个Dictionary< string,bool>密钥将包含节点路径,值将包含展开状态。