c# - 如何删除所有不需要的 TreeView 分支

标签 c# asp.net treeview self-join

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

根 分行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 解决这个问题会有很大帮助!非常感谢!

最佳答案

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

//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);
    }
}

关于c# - 如何删除所有不需要的 TreeView 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13855028/

相关文章:

c# - 在 C# 中打印整个数组

asp.net - 如何在新标签页中打开弹出页面

asp.net - 无法在 IIS 上加载文件或程序集“System.Net.Http,版本=4.2.0.0,文化=中性”

c# - 如何在 asp.net mvc3 中进行搜索

python - 如何从 ttk.Treeview 小部件中清除项目?

c# - 仅取消选中 TreeView 中的所有子节点

c# - 即使我没有使用 MySQL,ASP.NET 也找不到 MySQL 主机

c# - 我的正则表达式没有返回我需要的内容

c# - 绑定(bind)到来自两个不同类的属性值

c# - winforms webbrowser 浏览器时返回一组url地址