【问题标题】:How to remove all unwanted TreeView Branches如何删除所有不需要的 TreeView 分支
【发布时间】:2012-12-13 15:34:43
【问题描述】:

在 C# Treeview 中,我需要删除叶子列表中不包含值的所有分支。 例如,我有一个列表 { 112, 74 } 和一个树: 数据源是一个自联接表。所以我不能轻易去除不需要的叶子和树枝。

根 分支1 叶112 叶 1 分支2 叶74 分支3 叶44 分支4 叶99

我最终应该得到: 根 分支1 叶112 分支2 叶74

这里是代码。它有点工作。但是 TrimTree 只删除了底层。所以我需要运行这个函数几次才能完全删除所有的空分支。非常低效。

    void GetTree(ref TreeView tv)
    {
     DataTable dt = c.GetTable("select id, parent_id, name from tbl_self_join_tree");
        tv.DataSource = new HierarchicalDataSet(dt, "ID", "Parent_ID");
        tv.DataBind();
    }

    void TrimTree(TreeNodeCollection nodes, List<string> l)
    {
        TreeNode node = null;
        for (int ndx = nodes.Count; ndx > 0; ndx--)
        {
            node = nodes[ndx - 1];
            if (node.ChildNodes.Count  == 0 && !l.Contains(node.Value))
                nodes.Remove(node);
            else   
                TrimTree(node.ChildNodes, l);
        }
    }

如果我可以编写更好的 SELECT 查询,那么我将不需要 TrimTree() 函数:D 解决这个问题会有很大帮助!非常感谢!

【问题讨论】:

    标签: c# asp.net treeview self-join


    【解决方案1】:

    在我看来,您可以在处理子节点后处理父节点。这样你就可以处理删除所有叶子的分支:

    //DISCLAIMER: I didn't compile or test this method.
    void TrimTree(TreeNodeCollection nodes, List<string> l)
    {
        TreeNode node = null;
        for (int ndx = nodes.Count; ndx > 0; ndx--)
        {
            node = nodes[ndx - 1];
            TrimTree(node.ChildNodes, l);
            if (node.ChildNodes.Count  == 0 && !l.Contains(node.Value))
                nodes.Remove(node);
        }
    }
    

    【讨论】:

    • 优秀...我没有想到在子节点之后处理父节点。这看起来足够有效,所以我现在不需要编写一个 etter SELECTR 查询。再次感谢!
    • @EricNewman 恭喜!如果您认为您的问题已经得到解答,那么您可以接受答案。查看faq
    • @EricNewman 我相信您应该考虑优化您的数据库查询。对我来说,手动编辑 UI 元素看起来更像是一种解决方法。
    • 手动编辑 UI 元素是一种解决方法。但我什至不知道如何开始这样的查询。我可以轻松过滤掉我想要的叶子,但树枝会保留。
    • @EricNewman 您可以发布另一个针对 sql 查询的问题。我只能在您的问题中看到tbl_self_join_tree
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 2016-01-09
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2011-09-01
    • 2019-07-19
    相关资源
    最近更新 更多