2008-11-24 12 views
1

J'ai un N-Ary non trié en n'importe quel arbre et chaque nœud peut avoir des enfants 0-N. Étant donné la structure de données ci-dessous, comment puis-je remplir l'arborescence en supposant que vous avez un tableau de TermNodes et que ce tableau est le premier niveau de TreeView? Je n'ai pas été capable de trouver une façon récursive de le faire.Remplissage d'un contrôle TreeView

class TermNode 
{ 
    public string Name; 
    public string Definition; 
    public List<TermNode> Children 
} 

Répondre

0

Merci Tout ce que je devenais confus parce que je ne savais pas que pour une donnée TreeNode tn, tn.Nodes.Add serait retourner la valeur ajoutée TreeNode une fois que vous savez que la solution est simple comme si

private void /*TreeNode*/ RecursiveAdd(OntologyNode on, TreeNode tn) 
{ 
    if (on.Children.Count == 0) 
    { 
     return;    
    } 
    foreach (OntologyNode child in on.Children) 
    { 
     TreeNode tCur = tn.Nodes.Add(child.Name); 
     tCur.Tag = child;//optional for some selected node events 
     RecursiveAdd(child, tCur);    
    } 
} 

et le début de l'appel récursif

foreach(OntologyNode on in Nodes) 
{ 
    if (on.IsTopLevelNode == true)// internal not pertinent to this code snippet 
    { 
      TreeNode tn = tvOntoBrowser.Nodes.Add(on.Name); 
      tn.Tag = on; 
      if (on.Children.Count > 0) 
      { 
       RecursiveAdd(on, tn); 
      } 
    } 

    } 
1

Voici un peu de code pour commencer la récursivité. Il est pas testé (je ne peux pas en ce moment), mais vous devriez avoir l'idée:

public static void BuildTreeView(TreeNodeCollection Parent, List<TermNode> TermNodeList) 
{ 
    foreach (TermNode n in TermNodeList) 
    { 
    TreeNode CurrentNode = Parent.Add(n.Name); 
    // no need to recurse on empty list 
    if (n.List.Count > 0) BuildTreeView(CurrentNode.Nodes, n.List); 
    } 
} 

// initial call 
List<TermNode> AllTermNodes = /* all your nodes at root level */; 

BuildTreeView(treeView1.Nodes, AllTermNodes); 
1

Tout a sorti génériques pour un spin .. A travaillé bien. Un coup d'oeil à ...

public interface INode<T> 
{ 
    List<T> Children { get; } 
} 
class TermNode:INode<TermNode> 
{ 
    public string Name; 
    public string Definition; 
    public List<TermNode> Children { get; set; } 
    public TermNode() 
    { 
     this.Children = new List<TermNode>(); 
    } 
} 

public class TreeBuilder<T> where T : INode<T> 
{ 
    public Func<T, TreeNode> obCreateNodeFunc; 

    public void AddNode(TreeView obTreeView, T obNodeToAdd, TreeNode obParentNodeIfAny) 
    { 
     TreeNodeCollection obNodes; 
     if (obParentNodeIfAny == null) 
     { 
      obNodes = obTreeView.Nodes; 
     } 
     else 
     { 
      obNodes = obParentNodeIfAny.Nodes; 
     } 
     int iNewNodeIndex = obNodes.Add(obCreateNodeFunc(obNodeToAdd)); 
     TreeNode obNewNode = obNodes[iNewNodeIndex]; 

     foreach (T child in obNodeToAdd.Children) 
     { 
      AddNode(obTreeView, child, obNewNode); 
     } 
    } 
} 

// calling code - Some class 
    static TreeNode GetTreeNodeFor(TermNode t) 
    { 
     return new TreeNode(t.Name); // or any logic that returns corr TreeNode for T 
    } 

    void Main()... 
    { 
     TermNode[] arrNodesList;  
     // populate list with nodes 

     TreeBuilder<TermNode> tb = new TreeBuilder<TermNode>(); 
     tb.obCreateNodeFunc = GetTreeNodeFor; 
     foreach (TermNode obNode in arrNodesList) 
     { 
      tb.AddNode(treeView, obNode, null); 
     } 
    } 
Questions connexes