Dynamisches Auffüllen von Strukturansichten (C #)

Ich habe eine Tabelle mit 3 Spalten, ID, Name und ParentID. Die ID-Spalte enthält die laufende Nummer, die auch als Primärschlüssel dient. Die ID ist auch die des KnotensName Eigenschaften. Die Namensspalte enthält einen String, der der Treenode istText Attribut, während ParentID eine Spalte ist, die die übergeordnete ID des Knotens enthält.

So sieht mein Tisch aus:

ID     Name   ParentID
======================
1      A      0
2      A1     1
3      B      0
4      C      0
5      A2     1
6      B1     3

Diese Tabelle zeigt, dass Knoten A der übergeordnete Knoten für Knoten A1 und A2 ist. ParentID gleich "0" bedeutet, dass das übergeordnete Element des Knotens der Stammknoten ist (fest codiert). Beispielsweise sind Knoten A, B und C Kinder des Wurzelknotens.

Ich sortiere die Zeilen nach ParentID, bevor ich die Strukturansicht auffülle. Ich fülle die Baumansicht mit diesen beiden Methoden aus (TreeNode-Knoten ist hier der Childnode, der in den Baum eingefügt wird):

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

Alles ist in Ordnung, bis ich die Knoten per Drag & Drop in Knoten A als untergeordnetes Element von Knoten C eingebe und die Änderungen in die Datenbank übernehme.

Nun sieht meine Datenbanktabelle so aus:

ID     Name   ParentID
======================
1      A      4
2      A1     1
3      B      0
4      C      0
5      A2     1
6      B1     3

Beim nächsten Ausführen der Anwendung können die Knoten A1 und A2 nicht in den Baum eingefügt werden, da die übergeordneten Knoten nicht gefunden wurden. Dies liegt daran, dass, wenn ich die Zeilen vor dem Auffüllen der Strukturansicht nach ParentID sortiere, die Zeilen folgendermaßen sortiert werden:

ID     Name   ParentID
======================
3      B      0
4      C      0
2      A1     1
5      A2     1
6      B1     3
1      A      4

Auf diese Weise versucht meine Anwendung, A1- und A2-Knoten in die Struktur einzufügen, noch bevor Knoten A erstellt wird. Daher konnte die Anwendung das übergeordnete Element für Knoten A1 und A2 nicht finden.

Kann mir jemand einen Weg nennen, um diesen Fehler zu beheben, oder gibt es einen besseren Weg, um eine Baumansicht dynamisch zu füllen?

Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage