Récursif de l'arbre de création
J'ai un Node
classe en C# avec les propriétés suivantes:
public class Node
{
public int Id {get;set;}
public int? ParentId {get;set;}
public string Label {get;set;}
}
J'ai un TreeView
de contrôle qui fournit la méthode suivante pour créer
un nouveau nœud:
MyTreeView.CreateNode(key, label);
parent.Nodes.CreateNode(key, label);
Si je veux ajouter un nouveau nœud enfant j'ai besoin d'utiliser la deuxième méthode, sinon la première. Les deux renvoie un objet de type TreeNode
.
Comment voulez-vous créer en C# une fonction récursive pour remplir le treeview considérant que la racine des nœuds ont ParentId = null
?
C'est ce que j'ai fait jusqu'à présent:
//create a list of root nodes
var roots = myList.Where(x => x.ParentId == null);
//send the roots to a recursive func
foreach(var root in roots)
{
AddNode(null,root,myList);
}
c'est ma fonction récursive:
private void AddNode(Node parent, Node current, IList<Node> items)
{
TreeNode treenode = null;
if(parent == null)
{
treenode = mytree.CreateNode(current.Id.ToString(), current.Label);
}else{
var parentnode = mytree.GetNode(parent.Id.ToString());
treenode = parentnode.Nodes.CreateNode(current.Id.ToString(), current.Label);
}
//call the recursion for the children
var children = items.Where(x => x.ParentId == current.Id);
foreach(var child in children)
{
AddNode(current, child, items);
}
}
- Vous avez besoin d'ajouter le C# tag. Si c'est les devoirs, vous devez ajouter les devoirs balise ainsi. Aussi, vous devez nous montrer un exemple de code de ce que vous avez essayé.
- Ok, je vais modifier le post, merci.
- quel est le problème avec cette fonction? outre le fait que vous n'avez pas besoin de la variable treenode
- C'est mal parce que je dois tout faire en un seul appel, ce que je fais ici est de deux appels. J'ai bien sur l'ajout d'une extension avec LinQ mais je ne suis pas si bon avec elle.
- Vous avez oublié de mentionner quelque chose qui me semble très important. Vous êtes de la génération de votre arbre à partir d'une sorte de
IList
Ce qui est dans votre liste? On peut faire une inférence, mais ne Pouvez pas savoir à coup sûr - Qu'entendez-vous par 2 appels? Par définition d'une fonction récursive, vous avez besoin d'au moins 2 appels: l'Un pour la première itération et Un pour la récursivité. Et la fonction que vous semble correcte, même si elle est loin d'être optimum.
Vous devez vous connecter pour publier un commentaire.
Si votre arborescence de contrôle est dérivé à partir du Système.De Windows.Les formulaires.TreeView vous pouvez remplacer
avec
Donc, l'appel va toujours à une collection de Nœuds qui est de type TreeNodeCollection. Au lieu de votre Nœud d'objet vous pouvez maintenant utiliser la collection de Nœuds en tant que paramètre.
Ceci a deux avantages:
Toutefois, si vous ne pouvez pas accéder à l'Arborescence.Collection de nœuds dans le AddNode à appeler pour chaque racine, vous devrez vérifier que dans le haut de la AddNode méthode.
Essayez ce code:
Je ne pouvais pas tester complètement, de sorte que vous pourriez avoir besoin de modifier le code pour le faire fonctionner, mais il doit être assez proche.
Je serais probablement faire quelque chose comme ça...