2

C#ツリービューでは、リーフのリストに値が含まれていないすべてのブランチを削除する必要があります。たとえば、リスト{112、74}とツリーがあります。データソースは自己結合テーブルです。そのため、不要な葉や枝を簡単に取り除くことはできません。

ルートBranch1Leaf112 Leaf 1 Branch2 Leaf 74 Branch3 Leaf 44 Branch4 Leaf 99

最終的には次のようになります。RootBranch1Leaf112 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 に答える