0

我的母版页中有一个树视图。加载内容页面时,我想保存树视图状态(哪些节点折叠/展开)。我将节点存储在 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 包含我所有的节点,所以这是正确的。但是,所有节点都将属性 expended 设置为 false。这是不正确的,因为我扩展了多个节点。

希望你们能理解我的问题并能帮助我。

先进的Thnx

4

1 回答 1

1

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

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

于 2009-02-05T14:55:36.273 回答