如何保持treeview节点选中时的展开状态。

gzlaspnet 2013-10-15 11:20:20
也就是我就点击展开某一个子节点后,再点击子节点页,页刷新后,这个treeview又折叠了。如何保持treeview节点选中时的展开状态呢?
...全文
406 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzlaspnet 2013-10-15
  • 打赏
  • 举报
回复
说了半天,其实我用ztee这个js的树,是实现了的,请看:www.cnjqw.net左边的产品列表。 只是那个样式客户说不要那个加号和减号,我不知道如何去掉,我就想用一用treeview,想刷新后还能保持展开或折叠加的状态。
  • 打赏
  • 举报
回复
在asp.net中,一个应用功能只有一个页面。如果跳转到别的页面,一切页面状态就从头开始初始化了。因此点击节点,如果界面差别很大,会加在不同的用户控件(就像上面的UpdatePanel2中局部改变一样),而不是跳转到别的页面。 很遗憾,我已经懒得建议你去学习asp.net了。如果你准备学web的企业应用程序开发,建议学习silverlight。
  • 打赏
  • 举报
回复
贴一个前几年写的demo:
<%@ Page Language="C#" %>

<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        switch (e.Node.Value)
        {
            case "N1":
                e.Node.ChildNodes.Add(new TreeNode { Text = "张三", Value = "a" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "李四", Value = "b" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "王五", Value = "c", PopulateOnDemand = true });
                break;
            case "N2":
                e.Node.ChildNodes.Add(new TreeNode { Text = "1" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "2" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "3" });
                break;
            case "N3":
                e.Node.ChildNodes.Add(new TreeNode { Text = "A" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "B" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "C" });
                break;
            case "c":
                e.Node.ChildNodes.Add(new TreeNode { Text = "张三他爸" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "张三他妈" });
                e.Node.ChildNodes.Add(new TreeNode { Text = "张三他弟" });
                break;
        }
    }

    private List<string> 选中过的节点
    {
        get
        {
            var x = ViewState["selected"];
            if (x == null)
            {
                x = new List<string>();
                ViewState["selected"] = x;
            }
            return (List<string>)x;
        }
    }

    private void ShowLabel1()
    {
        var s = string.Empty;
        foreach (string node in 选中过的节点)
            s = node + "   " + s;
        this.Label1.Text = s;
        UpdatePanel2.Update();
    }

    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        选中过的节点.Add(TreeView1.SelectedNode.Value);
        ShowLabel1();
    }
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:TreeView ID="TreeView1" runat="server" ExpandDepth="0" OnTreeNodePopulate="TreeView1_TreeNodePopulate"
                EnableClientScript="False" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
                <Nodes>
                    <asp:TreeNode Text="N1" Value="N1" PopulateOnDemand="true"></asp:TreeNode>
                    <asp:TreeNode Text="N2" Value="N2" PopulateOnDemand="true"></asp:TreeNode>
                    <asp:TreeNode Text="N3" Value="N3" PopulateOnDemand="true"></asp:TreeNode>
                </Nodes>
            </asp:TreeView>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            你点击的节点:
            <asp:Label ID="Label1" runat="server" EnableViewState="False"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>
tcmakebest 2013-10-15
  • 打赏
  • 举报
回复
树形图的展开状态是能够自动保持的,楼主要找找刷新页面的时候进行了什么操作影响到了。
  • 打赏
  • 举报
回复
跳到子节点页,不是postback,导致状态丢失了 客户端的办法是用iframe(一般后台用) 服务端的搞法,就是让这个页面作为一个“主页面”,要展示的列表页和详情页等放到不同的用户控件中 通过Page_Init中LoadControl来实现界面的切换 这时由于都在同一个Page中,状态会被postback,就不会丢了
圣光麦造 2013-10-15
  • 打赏
  • 举报
回复
左边菜单是否于数据库中 在的话 点击时带入点击菜单的键 然后判断点击的是哪个 然后做展开操作
gzlaspnet 2013-10-15
  • 打赏
  • 举报
回复
To:yaotomo 您说的:cookie里保存用户的数据,哪个子节点是展开的。加载页面时先从cookie里找,如果有的话就加载cookie里的数据,并设置这个节点为展开状态。 这个具体如何操作呢,能否给段代码示例?
u011781558 2013-10-15
  • 打赏
  • 举报
回复
Node.Expanded=TRUE; OR ExpandDepth=0;
yaotomo 2013-10-15
  • 打赏
  • 举报
回复
cookie里保存用户的数据,哪个子节点是展开的。加载页面时先从cookie里找,如果有的话就加载cookie里的数据,并设置这个节点为展开状态。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧