2008-11-24 3 views
1

У меня есть N-Ary, не отсортированный никоим образом, и каждый узел может иметь 0-N детей. Учитывая структуру данных ниже, как я могу заполнить древовидное представление, предполагая, что у вас есть массив TermNodes, и этот массив является первым уровнем TreeView? Я не смог придумать рекурсивный способ сделать это.Заполнение элемента управления TreeView

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

ответ

0

Спасибо Все, что я путаться, потому что я не понимал, что для данного TreeNode тн, tn.Nodes.Add бы вернуть добавленный TreeNode После того, как вы знаете, что решение прямо вперед, как так

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

и начать рекурсивного вызова

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

Вот немного кода, чтобы вы начали с рекурсией. Это не тестировалось (я не могу прямо сейчас), но вы должны получить идею:

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

Просто достал генерики спина .. Работал красиво. Стоит посмотреть на ...

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); 
     } 
    } 
Смежные вопросы