asp.net treeview 仅展开选定的父级

标签 asp.net

我在 asp.net 中使用 Treeview
如果我选择任何父节点,那么它应该展开,其他父节点应该在页面回发(导航)之后折叠......我使用下面的代码。

 protected void Page_Load(object sender, EventArgs e)
{
 if (!IsPostBack)
        {
            if (Session["TreeViewState"] != null)
            {
                List<string> list = (List<string>)Session["TreeViewState"];
                RestoreTreeViewState(TreeViewApplicationSetup.Nodes, list);
            }
        }
        else
        {
            List<string> list = new List<string>(100);
            SaveTreeViewState(TreeViewApplicationSetup.Nodes, list);
            Session["TreeViewState"] = list;
        }
}



 private void SaveTreeViewState(TreeNodeCollection nodes, List<string> list)
    {
        Session["TreeViewState"] = null;
        foreach (TreeNode node in nodes)
        {
            if (node.ChildNodes != null)
            {
                if (node.Expanded.HasValue && node.Expanded == true && !String.IsNullOrEmpty(node.Text))
                {
                    list.Add(node.Text);
                }
                if (node.ShowCheckBox == true && node.ChildNodes.Count == 0 && node.Parent.Expanded == true)
                {
                    if (node.Checked == true)
                    {
                        list.Add(node.ValuePath + "-T");
                    }
                    else
                    {
                        list.Add(node.ValuePath + "-F");
                    }
                }
                SaveTreeViewState(node.ChildNodes, list);
            }
        }
    }
    private void RestoreTreeViewState(TreeNodeCollection nodes, List<string> list)
    {
        foreach (TreeNode node in nodes)
        {

            if (list.Contains(node.Text) || list.Contains(node.ValuePath + "-T") || list.Contains(node.ValuePath + "-F"))
            {
                if (node.ChildNodes != null && node.ChildNodes.Count != 0 && node.Expanded.HasValue && node.Expanded == false)
                {
                    if (node.Parent != null)
                    {
                        if (list.Contains(node.ChildNodes[0].ValuePath + "T") || list.Contains(node.ChildNodes[0].ValuePath + "-F"))
                        {
                            node.Expand();
                        }
                    }
                    else
                    {
                        node.Expand();
                    }
                }
                else if (node.ChildNodes != null && node.Expanded.HasValue && node.Expanded == false)
                {
                    if (node.ShowCheckBox == true && list.Contains(node.Parent.Text) && list.Contains(node.Parent.Parent.Text))
                    {
                        if (list.IndexOf(node.ValuePath + "-T") != -1)
                        {
                            node.Checked = true;

                        }
                        else if (list.IndexOf(node.ValuePath + "-F") != -1)
                        {
                            node.Checked = false;

                        }
                    }
                }
            }
            else
            {
                if (node.ChildNodes != null && node.ChildNodes.Count != 0 && node.Expanded.HasValue && node.Expanded == true)
                {
                    node.Collapse();
                }
            }
            if (node.ChildNodes != null && node.ChildNodes.Count != 0)
            {
                RestoreTreeViewState(node.ChildNodes, list);
            }
        }
    }

它的 jsut 帮助我在每个回发中扩展父节点,但其他父节点没有崩溃....

最佳答案

在您的 .aspx 文件中:

...
<asp:TreeView ID="Tree" runat="server" OnSelectedNodeChanged="Tree_SelectNodeChange">
...

然后在代码隐藏 Page_Load 中,您只需将数据绑定(bind)到 TreeView 并在 OnSelectedNodeChanged 处理程序中,您需要折叠所有节点,然后展开选定节点及其所有父节点:
protected void Tree_SelectNodeChange(object sender, EventArgs e)
{
    var tree = (TreeView)sender;
    foreach (TreeNode node in tree.Nodes)
    {
        node.CollapseAll();
    }
    ExpandToRoot(tree.SelectedNode);
}

private void ExpandToRoot(TreeNode node)
{
    node.Expand();
    if (node.Parent != null)
    {
        ExpandToRoot(node.Parent);
    }
}

关于asp.net treeview 仅展开选定的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278916/

相关文章:

.net - 是字符串值类型还是引用类型

c# - 在 CreateUserWizardStep 和 CompleteWizardStep 之后添加(到 CreateUserWizard 控件)附加向导步骤,但它们不会显示

c# - ASP.Net Core 错误 JSON

.net - 我可以使用 javascript 调用/请求 .net 处理程序 (ashx) 吗?

ASP.NET Core AuthenticationHandler 依赖注入(inject)

c# - 为什么我在 VS 2010 中出现奇怪的索引错误?

c# - 可以在文件系统中保存缩略图版本吗?通常的做法是什么?

c# - 使用 StreamReader 文本中的 XElement 创建新的 XDocument

c# - WebApi 500 内部服务器错误

javascript - asp.net 中 JavaScript 的转义变量