9
votes

Copiez tous les parents d'esclandre et enfants à une autre arborescence c # winforms

J'essaie de copier l'arborescence entière (exactement tous les nœuds) d'une arborescence (complètement) à une autre arboresview à l'aide de ce code:

    public static T DeepTreeCopy<T>(T obj)
    {
        object result = null;
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            result = (T)formatter.Deserialize(ms); ms.Close();
        }
        return (T)result;
    } 


2 commentaires

Dans le premier code, il faut supprimer les nœuds de la collection TreeView1, de noeuds avant d'ajouter à une autre collection: foreach (nœud Treenode dans arboresview1.nodes) {TreeView1.nodes.remove (noeud); } Cela devrait être plus rapide et plus propre que le clonage.


Je pense que la réponse clone () de @jeffjohnson devrait être marquée comme la réponse acceptée.


4 Réponses :


13
votes

Essayez ceci

public void Copy(TreeView treeview1, TreeView treeview2)
{
    TreeNode newTn;
    foreach (TreeNode tn in treeview1.Nodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        CopyChilds(newTn, tn);
        treeview2.Nodes.Add(newTn);
    }
}

public void CopyChilds(TreeNode parent, TreeNode willCopied)
{
    TreeNode newTn;
    foreach (TreeNode tn in willCopied.ChildNodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        parent.ChildNodes.Add(newTn);
    }
} 


3 commentaires

Merci, il a le même problème de (le nœud doit être supprimé avant la copie ou ne devrait être cloné)


Vous avez oublié la méthode CopyChild () en soi!


Vous devriez peut utiliser la méthode du clone. Il clonera tout le sous-arbre.



6
votes

à l'aide de la fonction nœud.clone () fonctionne aussi bien ...

TreeNode rootNode = new TreeNode("Root Node");
treeViewTarget.Nodes.Add(rootNode);
foreach (TreeNode node in treeViewSource.Nodes)
{
    rootNode.Nodes.Add((TreeNode)node.Clone());
}
rootNode.Expand();


4 commentaires

"Clone n'effectue qu'une" copie peu profonde: "afin que tous les nœuds enfants des nœuds en cours de copie ne soient pas copiés dans le nouvel arbreView.


@Billw. Je crois que MSDN dit qu'il clonera tout le sous-arbre. msdn.microsoft .com / fr-nous / bibliothèque / ...


Je viens de le tester et il clona effectivement tout le sous-arbre.


@surasb Notez que l'aspect "Copie peu profonde" est entré en jeu lorsque la valeur de balise d'une Treenode est un type de référence: Article MSDN cité: "La méthode de clone effectue une copie peu profonde du nœud. Si la valeur de la propriété Tag est un Type de référence, la copie originale et clonée indiquera la même instance unique de la valeur de la balise. "



8
votes

Comme la réponse de Mohd, mais avec la récursion pour obtenir tous les nœuds. (Nœuds d'enfance) xxx


1 commentaires

Le clonage sera un peu compliqué si vous dérivez de la Treenode (peut-être pas une plus grande idée).



-1
votes

Vous pouvez l'utiliser au niveau souhaité xxx


0 commentaires