我有ultraTree(infragistics树),它是在设计时创建的,它的自定义类为“Tag”。我有List作为成员变量。我有两个组合框。根据组合选择,我将检查List的每个项目“Tag”。如果列表包含,我只选择它,否则我创建一个新的UltraTree并将其添加到List并分配给在设计时创建的树。
我的问题是,我添加到集合中的内容得到引用,集合中的所有项目都被最后一项覆盖。 UltraTree没有任何克隆方法。
我没有找到任何使用此控件进行克隆的方法。
我的解决方案是什么:(
我的示例代码是
// My custom class
SelectedDeviceState treeState = new SelectedDeviceState(
firstDevice, secondDevice);
UltraTree tree = new UltraTree();
// This will clone the root node
// (it will be executed only once -> Root)
foreach (UltraTreeNode nod in tvwNavigation.Nodes)
{
UltraTreeNode tnode = nod.Clone() as UltraTreeNode;
tree.Nodes.Add(tnode);
}
//Adding the custom class as TAG
tree.Tag = treeState;
// Assigned and added
tvwNavigation = tree;
_treeCollection.Add(tree);
答案 0 :(得分:1)
他想知道如何获取对象的副本,而不是对对象的引用的副本。
答案 1 :(得分:1)
您可以通过编写一个方法来执行手动克隆,该方法会创建您的类型的新isntance,然后从原始对象为其分配值。
就树结构而言,您需要编写递归克隆,例如。
private ItemType CloneDeep(ItemType node)
{
ItemType clone = new ItemType();
clone.Property1 = node.Property1;
clone.Property2 = node.Property2;
foreach ( ItemType child in node.Nodes)
{
clone.Nodes.add(CloneDeep(child));
}
return clone;
}
也许看看extension methods。
答案 2 :(得分:1)
您可以使用一些基于反射的方法来深度复制自定义对象,谷歌用于“反射深层复制”。本文,例如:http://alpatrick.blogspot.com/2005/01/prototype-pattern-using-reflection.html,克隆所有使用自定义属性[DeepCopy]标记的属性,但您可以自己轻松更改该行为。
此外,SO上有一个类似的主题:How to deep copy between objects of different types in C#.NET
[编辑] 请注意,与您的示例相比,只需创建树节点的完整深层副本即可 。节点可能包含对树的引用,以及可能唯一且不会复制到其他节点的其他内部内容。
在这种情况下,您只需创建一个新节点(使用构造函数),从源节点分配数据,然后添加新节点节点到树。
总体上最好的方法是将树绑定到您的数据,这样您永远不会手动更改树,但每当您更改数据时都会自动更新。查看关于“数据绑定”的Infragistics文档,这应该是最好的方法。
答案 3 :(得分:0)
您可以使用UltraTree的SaveToBinary()方法进行克隆。
代码应如下所示:
void CloneTree()
{
//save the current tree into stream
var savedTree = new MemoryStream();
ultraTree1.SaveAsBinary(savedTree);
byte[] buffer = savedTree.ToArray();
savedTree.Close()
//create a clone from the stream
UltraTree newTree = new UltraTree();
newTree.LoadFromBinary(new MemoryStream(buffer));
}
我希望这会有所帮助: - )