需要UltraTree克隆方法 - 参考问题

时间:2009-04-24 07:54:56

标签: c# infragistics ultratree

我有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);

4 个答案:

答案 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));
}

我希望这会有所帮助: - )