【问题标题】:Copy all treeView parent and children to another treeView c# WinForms将所有treeView父级和子级复制到另一个treeView c# WinForms
【发布时间】:2011-08-02 22:46:39
【问题描述】:

我正在尝试使用此代码将树视图的整个树(完全是所有节点)(完全)复制到另一个树视图:

        TreeNodeCollection myTreeNodeCollection = treeView1.Nodes;

        TreeNode[] myTreeNodeArray = new TreeNode[treeView1.Nodes.Count];

        treeView1.Nodes.CopyTo(myTreeNodeArray, 0);

        treeView2.Nodes.AddRange(myTreeNodeArray);

但这不允许我这样做,它要求删除源树视图中的节点或使用它克隆!我怎样才能做到这一点?我不希望我的源树视图在这个过程中丢失任何东西。

** 更新 ** 好吧,伙计们,我找到了一个复杂的代码(对我来说!!)但是我该如何使用它呢?

    public static T DeepTreeCopy<T>(T obj)
    {
        object result = null;
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            result = (T)formatter.Deserialize(ms); ms.Close();
        }
        return (T)result;
    } 

【问题讨论】:

  • 在第一个代码中,需要先从 TreeView1,Nodes 集合中删除节点,然后再将它们添加到其他集合:foreach (TreeNode node in treeView1.Nodes) { treeView1.Nodes.Remove(node); } 这应该比克隆更快更干净。
  • 我认为 @jeffjohnson 的 Clone() 答案应该被标记为已接受的答案。

标签: c# treeview copy clone


【解决方案1】:

试试这个

public void Copy(TreeView treeview1, TreeView treeview2)
{
    TreeNode newTn;
    foreach (TreeNode tn in treeview1.Nodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        CopyChilds(newTn, tn);
        treeview2.Nodes.Add(newTn);
    }
}

public void CopyChilds(TreeNode parent, TreeNode willCopied)
{
    TreeNode newTn;
    foreach (TreeNode tn in willCopied.ChildNodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        parent.ChildNodes.Add(newTn);
    }
} 

我的问候

【讨论】:

  • 谢谢,有同样的问题(复制前应删除节点或克隆)
  • 你忘了调用 CopyChild() 方法本身!
  • 您应该可以使用克隆方法。它将克隆整个子树。
【解决方案2】:

类似于 MohD 的答案,但使用递归来获取所有节点。 (子节点的节点)

    public void CopyTreeNodes(TreeView treeview1, TreeView treeview2)
    {
        TreeNode newTn;
        foreach (TreeNode tn in treeview1.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.ImageIndex, tn.SelectedImageIndex);
            CopyChildren(newTn, tn);
            treeview2.Nodes.Add(newTn);
        }
    }
    public void CopyChildren(TreeNode parent, TreeNode original)
    {
        TreeNode newTn;
        foreach (TreeNode tn in original.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.ImageIndex, tn.SelectedImageIndex);
            parent.Nodes.Add(newTn);
            CopyChildren(newTn, tn);
        }
    } 

【讨论】:

  • 如果你从 TreeNode 派生,克隆会有点复杂(也许不是一个好主意)。
【解决方案3】:

使用 node.Clone() 函数也可以...

foreach (TreeNode node in treeViewSource.Nodes)
{
    treeViewTarget.Nodes.Add((TreeNode)node.Clone());
}

添加根节点将有助于确保“PlusMinus”功能可见。

TreeNode rootNode = new TreeNode("Root Node");
treeViewTarget.Nodes.Add(rootNode);
foreach (TreeNode node in treeViewSource.Nodes)
{
    rootNode.Nodes.Add((TreeNode)node.Clone());
}
rootNode.Expand();

【讨论】:

  • 'Clone 只执行“浅拷贝:”所以被拷贝节点的任何子节点都不会被拷贝到新的 TreeView 中。
  • @BillW。我相信 MSDN 说它会克隆整个子树。 msdn.microsoft.com/en-us/library/…
  • 我刚刚测试过它确实克隆了整个子树。
  • @surasb 请注意,当 TreeNode 的标记值是引用类型时,“浅拷贝”方面会发挥作用 类型:引用的 MSDN 文章:“Clone 方法执行节点的浅拷贝。如果Tag 属性的值是一个引用类型,原始副本和克隆副本都将指向同一 Tag 值的单个实例。"
【解决方案4】:

谢谢大家的回答。结合所有答案,这对我有用。即使树视图有多个级别。

  public void CopyTreeNodes(TreeView treeview1, TreeView treeview2)
    {
        TreeNode newTn;
        foreach (TreeNode tn in treeview1.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.Value);
            CopyChildren(newTn, tn);
            treeview2.Nodes.Add(newTn);
        }
    }

 public void CopyChildren(TreeNode parent, TreeNode original)
    {
        TreeNode newTn;
        foreach (TreeNode tn in original.ChildNodes)
        {
            newTn = new TreeNode(tn.Text, tn.Value);
            parent.ChildNodes.Add(newTn);
            CopyChildren(newTn, tn);
        }
    }

【讨论】:

    【解决方案5】:

    您可以在所需的级别使用它

         public void RootCopy(TreeView treeview1, TreeView treeview2)
        {
            TreeNode newNode;
            foreach (TreeNode tnode in treeview1.Nodes)
            {
                newNode = new TreeNode(tnode.Text);
                treeview2.Nodes.Add(newNode);
                if (tnode.Nodes.Count != 0)
                {
                    int _1index = tnode.Index;
                    ChildsCopyLevel2(_1index, treeview1, treeview2);
                }
    
    
            }
    
        }
    
    
        public void ChildsCopyLevel2(int index1, TreeView TV1, TreeView TV2)
        {
            foreach (TreeNode Tnode in TV1.Nodes[index1].Nodes)
            {
                string Childtext = Tnode.Text;
                TV2.Nodes[index1].Nodes.Add(Childtext);
                if (Tnode.Nodes.Count != 0)
                {// ChildsCopyLevel3(Tnode.Nodes.Count, TV1, TV2);
                    int _2index = Tnode.Index;
                    ChildsCopyLevel3(index1, _2index, TV1, TV2);
                }
            }
    
        }
    
    
        public void ChildsCopyLevel3(int index1, int index2, TreeView TV1, TreeView TV2)
        {
            foreach (TreeNode Tnode in TV1.Nodes[index1].Nodes[index2].Nodes)
            {
                string Childtext = Tnode.Text;
                TV2.Nodes[index1].Nodes[index2].Nodes.Add(Childtext);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多