Рекурсивное построение дерева - сложная задача даже для опытного программиста.Я понимаю, что немного опоздал на вечеринку по этому вопросу, учитывая, что он был первоначально опубликован в марте 2011 года. Лучше поздно, чем никогда?
Одним из важных факторов при создании дерева является только проверка того, что ваш набор данных отформатированправильно.Вам просто нужен способ связать родителя с ребенком.Как только связь четко определена, вы можете начать кодировать решение.Я решил использовать простой формат, подобный следующему:
ParentId ChildId
1 2
1 3
2 4
3 5
И т. Д.
После того, как это отношение установлено, я разработал рекурсивный метод для перебора набора данных для построения дерева.
Сначала я идентифицирую все родительские узлы и сохраню их в коллекции, присваивая каждому уникальный идентификатор, используя комбинацию родительского идентификатора и дочернего идентификатора:
private void IdentifyParentNodes()
{
SortedList<string, MyTreeNode> newParentNodes = new SortedList<string,MyTreeNode>();
Dictionary<string, string> parents = new Dictionary<string, string>();
foreach (MyTreeNode oParent in MyTreeDataSource.Values)
{
if (!parents.ContainsValue(oParent.ParentId))
{
parents.Add(oParent.ParentId + "." + oParent.ChildId, oParent.ParentId);
newParentNodes.Add(oParent.ParentId + "." + oParent.ChildId, oParent);
}
}
this._parentNodes = newParentNodes;
}
Затем корневой вызывающий метод будет зацикленчерез родителей и вызовите рекурсивный метод для построения дерева:
// Build the rest of the tree
foreach (MyTreeNode node in ParentNodes.Values)
{
RecursivelyBuildTree(node);
}
Рекурсивный метод:
private void RecursivelyBuildTree(MyTreeNode node)
{
int nodePosition = 0;
_renderedTree.Append(FormatNode(MyTreeNodeType.Parent, node, 0));
_renderedTree.Append(NodeContainer("open", node.ParentId));
foreach (MyTreeNode child in GetChildren(node.ParentId).Values)
{
nodePosition++;
if (IsParent(child.ChildId))
{
RecursivelyBuildTree(child);
}
else
{
_renderedTree.Append(FormatNode(MyTreeNodeType.Leaf, child, nodePosition));
}
}
_renderedTree.Append(NodeContainer("close", node.ParentId));
}
Метод, используемый для получения потомков родителей:
private SortedList<string, MyTreeNode> GetChildren(string parentId)
{
SortedList<string, MyTreeNode> childNodes = new SortedList<string, MyTreeNode>();
foreach (MyTreeNode node in this.MyTreeDataSource.Values)
{
if (node.ParentId == parentId)
{
childNodes.Add(node.ParentId + node.ChildId, node);
}
}
return childNodes;
}
Не такой сложный или элегантный, но он сделал свою работу.Это было написано в 2007 году, поэтому это старый код, но он все еще работает.:-) Надеюсь, это поможет.