1

TreeView任意の数のノードを含む があります。ユーザーは の任意のノードをチェックできTreeView、ボタンをクリックするとすぐに、チェックされたノードとその親以外のすべてを削除したいと考えています。ボタンをすべてセットアップして、ノードをプルーニングするメソッドを呼び出します。私が抱えている問題は、プルーニングの背後にあるロジックです。疑似コードでも役に立ちます。再帰的である必要があり、最も外側のノードから開始して上に向かって作業する必要があることはわかっていますが、再帰を思いつくことができないようです。

TreeView直接プルーニングするか、List<TreeNode>バインドできる新しいものを作成するかは気にしません。

どんな助けでも大歓迎です、ありがとう。

解決策: InBetween による解決策でロジックの問題は解決されましたが、まだ別の問題がありました。親からノードを削除する必要があります。だから、あなたがしなければならないことはできませTreeView.Remove(node)ParentNode.ChildNodes.Remove(node)

4

3 に答える 3

2

問題を別の視点から見ると役立つ場合があります。

可能であれば、ツリーがアイテムのチェックを管理する方法のロジックを最初に変更しないでください。

ユーザーがアイテムをチェックした場合、アイテムもその親も削除されません。したがって、ユーザーがアイテムをチェックするときは、選択したアイテムのルート アイテムに到達するまで、ツリーのすべてのアイテムをチェックします。これは簡単に実装できます。

プルーニングするときは、チェックされていないアイテムを探してツリーをトラバースする必要があります (ルート アイテムから開始してツリーを下に移動します)。これらを削除できるため、そのブランチの下に選択されたアイテムがあるかどうかを確認する必要なく、それにぶら下がっているすべてのアイテムを削除できます。

要件により、このオプションが有効でない可能性があります。

于 2011-05-31T21:53:54.593 に答える
2

子がクリックされた場合、親が自動選択されるという、似たようなことをしなければなりませんでした。したがって、最初にすべての親を選択し、次に選択したものを(上から)探すことでクリーンアップできるため、これが役立つと思います。

    private void RecursiveCheckNodesDown(TreeNodeCollection tree, bool checkedFlag)
    {
        if (tree != null) 
            foreach (TreeNode node in tree)
                RecursiveCheckNodesDown(node.Nodes, node.Checked = checkedFlag);
    }

    private void RecursiveCheckNodesUp(TreeNode node, bool checkedFlag)
    {
        if( node != null )
            RecursiveCheckNodesUp(node.Parent, node.Checked = checkedFlag);
    }

    private void SomeTreeBeginUpdate()
    {
        SomeTree.BeginUpdate();
        SomeTree.AfterCheck -= SomeTree_AfterCheck;
    }

    private void SomeTreeEndUpdate()
    {
        SomeTree.AfterCheck += SomeTree_AfterCheck;
        SomeTree.EndUpdate();
    }

    private void SomeTree_AfterCheck(object sender, TreeViewEventArgs e)
    {
        SomeTreeBeginUpdate();
        RecursiveCheckNodesDown(e.Node.Nodes, e.Node.Checked);
        if( e.Node.Checked )
            RecursiveCheckNodesUp(e.Node.Parent, e.Node.Checked);
        SomeTreeEndUpdate();
    }

    this.SomeTree.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.SomeTree_AfterCheck);
于 2011-05-31T21:54:41.473 に答える
0

これは、深さ優先検索を実装することで実行できます...

何かのようなもの

//pseudocode
bool prune(treenode t)
{
   bool mayNotDeleteThisNode=t.isChecked;
   foreach(treenode c in t.childnodes)
   {
      if(prune(c)) mayNotDeleteThisNode=true;
   }

   if(!mayNotDeleteThisNode)
   {
      delete(t)
   }

   return mayNotDeleteThisNode;
}
于 2011-05-31T22:02:29.147 に答える