0

我有在设计时创建的ultraTree(基础设施树),它有自定义类作为“标签”。我有 List 作为成员变量。我有两个组合框。根据组合选择,我将检查列表的每个项目“标签”。如果列表包含,我就选择它,否则我创建一个新的 UltraTree 并将其添加到列表中,然后分配给在设计时创建的树。

我的问题是,我添加到集合中的内容得到了引用,并且集合中的所有项目都被最后一项覆盖。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

4 回答 4

1

他想知道如何获取对象的副本,而不是对象引用的副本。

于 2009-04-24T08:01:29.827 回答
1

您可以通过编写一个创建您的类型的新实例然后从原始对象为其分配值的方法来执行手动克隆。

就树结构而言,您需要编写一个递归克隆,例如。

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;
}

也许看看扩展方法

于 2009-04-24T08:01:46.190 回答
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 文档,这应该是最好的方法。

于 2009-04-24T08:16:26.280 回答
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));
}

我希望这有帮助 :-)

于 2009-11-12T10:01:47.190 回答