2009-04-24 4 views
0

J'ai ultraTree (arbre infragistics) qui est créé au moment du design et il a la classe personnalisée comme "Tag". J'ai List comme variable membre. J'ai deux combo box. En fonction de la sélection de combo, je vais vérifier les éléments de chaque liste "Tag". Si la liste contient, il suffit de choisir, sinon je crée un nouvel UltraTree et l'ajoute à la liste et j'assigne à l'arbre qui est créé au moment du design.Besoin d'UltraTree Clone Méthode - Problème avec la référence

Mon problème est, ce que j'ajoute à la collection obtient une référence et tous les éléments de la collection sont remplacés par le dernier élément. UltraTree n'a aucune méthode de clonage.

Je n'ai trouvé aucun moyen de cloner en utilisant ce contrôle.

Que peut-être ma solution :(

Mon exemple de code est

// 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

Ne lui donnez pas la douleur, nous allons obtenir juste un éditeur de tarte il un peu –

Répondre

1

Vous pouvez effectuer un clone manuel en écrivant une méthode qui crée une nouvelle isntance de votre type affecte ensuite les valeurs à lui de l'objet original.

en termes de structure de l'arbre, vous auriez besoin d'écrire un clone récursif, quelque chose comme.

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

Peut-être à regarder extension methods.

1

Il veut savoir comment obtenir une copie d'un objet, plutôt qu'une copie d'une référence à un objet.

1

Il existe des méthodes basées sur la réflexion que vous pouvez utiliser pour copier en profondeur un objet personnalisé, recherchez "Copie profonde de réflexion". Cet article, par exemple: http://alpatrick.blogspot.com/2005/01/prototype-pattern-using-reflection.html, clone toutes les propriétés marquées avec un attribut personnalisé [DeepCopy], mais vous pouvez facilement modifier ce comportement vous-même.

En outre, il y a un fil similaire sur le SO: How to deep copy between objects of different types in C#.NET

[Modifier] Notez que dans votre exemple, il peut pas sage de simplement créer une copie en profondeur complète de votre nœud d'arborescence. Un nœud peut contenir des références à l'arborescence et d'autres éléments internes qui pourraient éventuellement être uniques et ne pas être copiés sur un nœud différent.

Dans ce cas, il vous suffit de créer un nouveau nœud (en utilisant un constructeur), d'insérer les données à partir du nœud source, puis ajouter le nouveau nœud à l'arbre. La meilleure façon générale serait de lier votre arbre à vos données, de sorte que jamais changer manuellement l'arbre, mais le mettre à jour automatiquement chaque fois que vous modifiez vos données. Vérifiez votre documentation Infragistics sur "liaison de données", ce devrait être la meilleure approche.

0

Vous pouvez utiliser la méthode SaveToBinary() d'UltraTree pour cloner.

le code devrait ressembler à ceci:

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

J'espère que cette aide :-)

Questions connexes