2009-04-24 1 views
0

У меня есть UltraTree (дерево infragistics), которое создается во время разработки и имеет пользовательский класс как «тег». У меня есть List как переменная-член. У меня есть два комбинированных блока. Основываясь на комбо-выборке, я проверю все элементы списка «Тег». Если список содержит, просто я выбираю это, в противном случае я создаю новый UltraTree и добавляю его в List и я назначаю Дерево, которое создается во время разработки.Нужна технология UltraTree Clone - проблема со ссылкой

Моя проблема в том, что я добавляю в коллекцию, получает ссылку, и весь элемент в коллекции перезаписывается последним элементом. У 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

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

1

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

1

Есть некоторые методы, основанные на отражении, которые вы можете использовать для глубокого копирования пользовательского объекта, google для «Reflection deep copy». Эта статья, например: 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 на «привязку данных», это должен быть лучший подход.

0

Вы можете использовать метод 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)); 
} 

Я надеюсь, что это помогает :-)