Как динамически заполнить treeview (C#)

У меня есть таблица с 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.

Следовательно, может ли кто-нибудь сказать мне, как исправить эту ошибку, или есть ли лучший способ динамического заполнения древовидной структуры?

Спасибо.

6
задан stuartd 30 May 2012 в 10:33
поделиться