今天有同学问该如何clone一个TreeView。然后我问他是要浅拷贝还是深拷贝,他说浅拷贝也没问题,只要看起来内容一样就行。
那就好办了不是么。TreeView本身没办法Clone(),不过只是要内容一样的话,只要把顶层的TreeNode从源TreeView复制到目标TreeView就OK。
假如我有一个Form1,里面有一个treeView1成员。有一个按钮,点击它会创建一个Form2,像这样:
Form1.cs:
然后Form2里也有一个treeView1成员,并且构造器接受一个TreeView的参数,像这样:
于是我们在Form2的构造器里就把参数里的TreeView的顶层TreeNode都复制了一次。完事。
或者下载一下这个工程去看看吧~
真在工作中肯定是不应该把一个Form的私有TreeView传给别的Form。更好的办法或许是先把TreeNodeCollection给复制到一个一维数组(TreeNodeCollection.CopyTo(TreeNode[] nodeArray, int index)),然后把这个数组传给目标。嘛怎么复制都好,反正浅拷贝的话只要复制顶层节点就OK。
Case closed.
那就好办了不是么。TreeView本身没办法Clone(),不过只是要内容一样的话,只要把顶层的TreeNode从源TreeView复制到目标TreeView就OK。
假如我有一个Form1,里面有一个treeView1成员。有一个按钮,点击它会创建一个Form2,像这样:
Form1.cs:
using System;
using System.Windows.Forms;
namespace TestTreeView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form form2 = new Form2(this.treeView1);
form2.Visible = true;
form2.Activate();
}
}
}
然后Form2里也有一个treeView1成员,并且构造器接受一个TreeView的参数,像这样:
using System.Windows.Forms;
namespace TestTreeView
{
public partial class Form2 : Form
{
public Form2(TreeView tv)
{
InitializeComponent();
this.treeView1.Nodes.Clear();
foreach (TreeNode node in tv.Nodes)
{
TreeNode newNode = node.Clone() as TreeNode;
this.treeView1.Nodes.Add(newNode);
}
}
}
}
于是我们在Form2的构造器里就把参数里的TreeView的顶层TreeNode都复制了一次。完事。
或者下载一下这个工程去看看吧~
真在工作中肯定是不应该把一个Form的私有TreeView传给别的Form。更好的办法或许是先把TreeNodeCollection给复制到一个一维数组(TreeNodeCollection.CopyTo(TreeNode[] nodeArray, int index)),然后把这个数组传给目标。嘛怎么复制都好,反正浅拷贝的话只要复制顶层节点就OK。
Case closed.