0

左側にディレクトリとファイル ブラウザーの TreeView を作成しました。ユーザーがツリーを参照して、別のツリービューに移動したいファイルとディレクトリを確認できるようにしたいと考えています。

もう 1 つの TreeView は、オンラインで見つけた TreeViewColumn というユーザー コントロールです。そのコントロールを使用して、ユーザーが選択したファイルとフォルダーに他のデータ (カテゴリ、属性) を追加できるようにします。

私が直面している問題は 2 つあります。すべての子を再帰的に追加する必要があります (これは理解できます) が、チェックされていない親をチェックされた子に追加する必要があります (階層を維持するため)。

   private void IterateTreeNodes(TreeNode originalNode, TreeNode rootNode)
    {
        //Take the node passed through and loop through all children
        foreach (TreeNode childNode in originalNode.Nodes)
        {
            // Create a new instance of the node, will need to add it to the recursion as a root item 
            // AND if checked it needs to get added to the new TreeView.
            TreeNode newNode = new TreeNode(childNode.Text);
            newNode.Tag = childNode.Tag;
            newNode.Name = childNode.Name;
            newNode.Checked = childNode.Checked;
            if (childNode.Checked)
            {
                // Now we know this is checked, but what if the parent of this item was NOT checked. 
                //We need to head back up the tree to find the first parent that exists in the tree and add the hierarchy.
                if (tvSelectedItems.TreeView.Nodes.ContainsKey(rootNode.Name)) // Means the parent exist?
                {

                    tvSelectedItems.TreeView.SelectedNode = rootNode;
                    tvSelectedItems.TreeView.SelectedNode.Nodes.Add(newNode);
                }
                else
                {
                    AddParents(childNode);

                    // Find the parent(s) and add them to the tree with their CheckState matching the original node's state
                    // When all parents have been added, add the current item.
                }
            }
            IterateTreeNodes(childNode, newNode);
        }

    }

    private TreeNode AddParents(TreeNode node)
    {
        if (node.Parent != null)
        {
            //tvDirectory.Nodes.Find(node.Name, false);
        }
        return null;
    }

チェックされたノード(およびチェックされた状態に関係なく、その親)を再帰的に追加するように、誰でもこのコードを手伝ってもらえますか。ディレクトリ階層を維持する必要があります。

助けてくれてありがとう!

4

2 に答える 2

1

むしろ (それほどきれいではなく、好ましくない) 解決策は、最初にツリーを複製してから、チェックされていないブランチを削除することです。

それ以外の場合は、ノードを追加するときに、ルートに到達するまでノードの親ノードをトラバースする再帰メソッドを記述します。そして、 childNode.parent が既に存在するかどうかを確認して最適化し、ブランチを無視して先に進みます。つまり、ルート ノードに戻ります。

于 2013-03-19T13:51:24.580 に答える
0

私はそれを働かせました。@Yahyaが言っていることはすでに知っていました。より簡単な方法/より良いアプローチを望んでいました。

以下のコードは確かに最適ではありません。私はそれを改善し続けますが、この時点では、左側のツリービューを調べて、チェックされたすべてのアイテム (およびそれらの親 - CheckedState に関係なく) を上のツリービューにコピーしています。右。

@Yahyaに答えてくれてありがとう。私は改善を受け入れていますが、これは 1 回限りの使用ユーティリティであることを覚えておいてください。

 private void cmdMoveRight_Click(object sender, EventArgs e)
    {
        tvSelectedItems.TreeView.Nodes.Clear();
        // Traverse first level Tree Nodes
        foreach (TreeNode originalNode in tvDirectory.Nodes)
        {

            TreeNode newNode = new TreeNode(originalNode.Text);
            newNode.Name = originalNode.Name;
            newNode.Tag = originalNode.Tag;
            newNode.Checked = originalNode.Checked;

            //Only add to the new treeview if the node is checked
            if (originalNode.Checked)
            {
                tvSelectedItems.TreeView.Nodes.Find(originalNode.Parent.Name,true)[0].Nodes.Add(newNode);
            }
            //Start recursion - this will be called for each first level node - there should technically only be 1 "ROOT" node.
            IterateTreeNodes(originalNode, newNode);
        }

    }


    private void IterateTreeNodes(TreeNode originalNode, TreeNode rootNode)
    {
        //Take the node passed through and loop through all children
        foreach (TreeNode childNode in originalNode.Nodes)
        {
            // Create a new instance of the node, will need to add it to the recursion as a root item 
            // AND if checked it needs to get added to the new TreeView.
            TreeNode newNode = new TreeNode(childNode.Text);
            newNode.Tag = childNode.Tag;
            newNode.Name = childNode.Name;
            newNode.Checked = childNode.Checked;
            if (childNode.Checked)
            {
                // Now we know this is checked, but what if the parent of this item was NOT checked. 
                //We need to head back up the tree to find the first parent that exists in the tree and add the hierarchy.
                  TreeNode[] nodestest = tvSelectedItems.TreeView.Nodes.Find(childNode.Parent.Name, true);
                  if (nodestest.Length > 0)
                  {
                      tvSelectedItems.TreeView.Nodes.Find(childNode.Parent.Name,true)[0].Nodes.Add(newNode);
                  }
                  else
                  {
                      AddParents(childNode);// Find the parent(s) and add them to the tree with their CheckState matching the original node's state


                  }
            }
            //recurse
            IterateTreeNodes(childNode, newNode);
        }

    }

    private void AddParents(TreeNode node)
    {

        if (node.Parent != null)// Check if parent is null (would mean we're looking at the root item
        {
            TreeNode[] nodestest = tvSelectedItems.TreeView.Nodes.Find(node.Parent.Name, true);
            if (nodestest.Length > 0)
            {

                TreeNode[] nodes = tvDirectory.Nodes.Find(node.Name, true);
                TreeNode newNode = new TreeNode(nodes[0].Text);
                newNode.Name = nodes[0].Name;
                newNode.Tag = nodes[0].Tag;
                newNode.Checked = nodes[0].Checked;
                tvSelectedItems.TreeView.Nodes[node.Parent.Name].Nodes.Add(newNode);
            }
            else
            {
                AddParents(node.Parent);

                TreeNode newNode = new TreeNode(node.Text);
                newNode.Name = node.Name;
                newNode.Tag = node.Tag;
                newNode.Checked = node.Checked;
                tvSelectedItems.TreeView.Nodes.Find(node.Parent.Name,true)[0].Nodes.Add(newNode);

            }
        }
        else // deal with root node
        {
            TreeNode rootNode = new TreeNode(node.Text);
            rootNode.Name = node.Name;
            rootNode.Tag = node.Tag;
            rootNode.Checked = node.Checked;
            tvSelectedItems.TreeView.Nodes.Add(rootNode);
        }

    }
于 2013-03-20T10:40:12.310 に答える