【问题标题】:C# Treeview state expandedC# Treeview 状态展开
【发布时间】:2009-02-05 22:55:37
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net treeview


    【解决方案1】:

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

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

    【讨论】:

    • 我现在存储值而不是对象:NodePaths.Add(t.Expanded);它没有帮助。所有的值都是假的
    • 当您使用 NodePaths.Add(t.Expanded) 添加它们时,您确定这些值是正确的吗?如果它们是值类型,一旦存储在会话中就改变是没有意义的。
    • 正确的值是什么意思?当我在我的母版页上展开树节点时,我知道展开一定是真的。
    • 但是,如果您在使用 NodePaths.Add(t.Expanded) 实际存储它们时打印(或在调试器中查看)所有值,它们是否正确? (例如:如您所愿扩展为真?)
    • 不,这是我的问题。默认情况下,我的树视图是折叠的。当我展开一些节点并触发卸载事件时,所有节点的属性都已扩展设置为 false。所以我的数组 NodePaths 只包含错误值...
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多