Нужен метод UltraTree Clone - проблема со ссылкой - PullRequest
0 голосов
/ 24 апреля 2009

У меня есть ultraTree (дерево инфраструктуры), которое создается во время разработки и имеет собственный класс как «Tag». У меня есть список в качестве переменной члена. У меня есть два поля со списком. Основываясь на выборе комбо, я буду проверять каждый пункт списка «Тег». Если список содержит, просто я выбираю его, в противном случае я создаю новое 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 ]

1 голос
/ 24 апреля 2009

Вы можете выполнить клонирование вручную, написав метод, который создает новый 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;
}

Может быть, посмотрите на методы расширения .

1 голос
/ 24 апреля 2009

Существует несколько методов на основе Reflection, которые можно использовать для глубокого копирования пользовательского объекта, Google для «глубокого копирования Reflection». Например, в этой статье: http://alpatrick.blogspot.com/2005/01/prototype-pattern-using-reflection.html, клонирует все свойства, отмеченные пользовательским атрибутом [DeepCopy], но вы можете легко изменить это поведение самостоятельно.

Также в SO есть похожая тема: Как выполнять глубокое копирование между объектами разных типов в C # .NET

[Редактировать] Обратите внимание, что в вашем примере может быть не разумно просто создать полную глубокую копию вашего узла дерева. Узел может содержать ссылки на дерево и другие внутренние элементы, которые могут быть уникальными и не копироваться в другой узел.

В этом случае вам следует просто создать новый узел (с помощью конструктора), назначить данные из исходного узла, а затем добавить новый узел на дерево.

Наилучшим способом было бы связать ваше дерево с вашими данными, чтобы вы никогда не вручную меняли дерево, но автоматически обновляли его всякий раз, когда вы меняете свои данные. Обратитесь к документации Infragistics по поводу «привязки данных», это должно быть лучшим подходом.

1 голос
/ 24 апреля 2009

Он хочет знать, как получить копию объекта, а не копию ссылки на объект.

0 голосов
/ 12 ноября 2009

Вы можете использовать метод SaveToBinary () UltraTree для клонирования.

код должен выглядеть так:

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

Надеюсь, это поможет: -)

...