【问题标题】:Need UltraTree Clone Method - Problem with reference需要 UltraTree 克隆方法 - 参考问题
【发布时间】:2010-10-21 13:22:06
【问题描述】:

我有在设计时创建的 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);

【问题讨论】:

  • 别让他伤心,让我们来找个编辑把它搞砸吧

标签: c# infragistics ultratree


【解决方案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;
}

也许看看extension methods

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用一些基于反射的方法来深度复制自定义对象,谷歌搜索“反射深度复制”。这篇文章,例如: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 文档,这应该是最好的方法。

      【讨论】:

        【解决方案4】:

        可以使用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));
        }
        

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

        【讨论】:

          猜你喜欢
          • 2019-12-09
          • 2014-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-18
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多