2

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

根枝1 叶112 叶1 枝2 叶74 枝3 叶44 枝4 叶99

我最终应该得到: Root Branch1 Leaf 112 Branch2 Leaf 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 解决这个问题会很有帮助!非常感谢!

4

1 回答 1

3

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

//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);
    }
}
于 2012-12-13T07:34:43.513 回答