У меня есть таблица с 3 столбцами: ID, Name и ParentID. Столбец ID содержит порядковый номер, который также служит первичным ключом. ID также будет являться свойством Nameузла. Столбец Name содержит строку, которая будет атрибутом Textузла дерева, а ParentID — это столбец, содержащий родительский идентификатор узла.
Вот как выглядит моя таблица:
ID Name ParentID
======================
1 A 0
2 A1 1
3 B 0
4 C 0
5 A2 1
6 B1 3
Эта таблица показывает, что узел A является родительским узлом для узлов A1 и A2. ParentID, равный «0», означает, что родителем узла является корневой узел (жестко закодированный). Например, узлы A, B и C являются дочерними узлами корневого узла.
Я сортирую строки по ParentID до заполнения дерева. Я заполняю древовидное представление, используя эти два метода (узел TreeNode здесь является дочерним узлом, который заполняется в дереве):
private void SearchParent(TreeView tree, String parentID, TreeNode node)
{
// Post: call TraverseParent method to search parent
TreeNodeCollection collection = tree.Nodes;
// Search parent recursively
foreach (TreeNode n in collection)
{
TraverseParent(n, parentID, node);
}
}
private void TraverseParent(TreeNode potentialParent, String parentID, TreeNode node)
{
// Post: search for parent. When parent is found add child to parent
// am i the parent that you're looking for?
if (parentID.CompareTo(potentialParent.Name) == 0)
{
// found me! i'm your parent!
// add child to parent
potentialParent.Nodes.Add(node);
// update that the parent for child has been found
parentFound = true;
}
else
{
// i'm not your parent
// continue to look for parent recursively
foreach (TreeNode n in potentialParent.Nodes)
{
TraverseParent(n, parentID, node);
}
}
}
Все хорошо, пока я не перетаскиваю узлы, делая узел A дочерним по отношению к узлу C и зафиксировать изменения в базе данных.
Теперь моя таблица базы данных выглядит следующим образом:
ID Name ParentID
======================
1 A 4
2 A1 1
3 B 0
4 C 0
5 A2 1
6 B1 3
При следующем запуске приложения ему не удается заполнить дерево узлами A1 и A2, поскольку не удалось найти их родителей. Это связано с тем, что когда я сортирую строки на основе ParentID перед заполнением древовидной структуры, строки сортируются следующим образом:
ID Name ParentID
======================
3 B 0
4 C 0
2 A1 1
5 A2 1
6 B1 3
1 A 4
Таким образом, мое приложение попытается заполнить узлы A1 и A2 в дереве еще до того, как будет создан узел A. Поэтому приложению не удалось найти родителя для узлов A1 и A2.
Следовательно, может ли кто-нибудь сказать мне, как исправить эту ошибку, или есть ли лучший способ динамического заполнения древовидной структуры?
Спасибо.