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



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

根分支机构1Leaf 112叶1分支2叶子74分支机构3叶子44分支机构4Leaf 99

我最终应该得到:根分支机构1Leaf 112分支2Leaf 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);
}
}

最新更新