Im Artikel „Ordner und Dateien in Access-Tabellen einlesen“ (www.vbentwickler.de/486) haben wir gezeigt, wie wir schnell Ordner und Dateien in Tabellen speichern, in „Dateien schnell im TreeView-Steuerelement anzeigen“ (www.vbentwickler.de/0) haben wir Techniken vorgestellt, mit denen wir die Daten dieser Tabellen performant in einem TreeView-Steuerelement präsentieren. Im vorliegenden Artikel schauen wir uns nun an, wie man in diesem TreeView-Steuerelement mit den Ordnern und Dateien arbeiten kann: Wie zeigen wir einen Ordner direkt im Windows-Explorer an? Wie öffnen wir eine Datei direkt per Doppelklick? Wie können wir Kopieren, Ausschneiden und Einfügen im TreeView nutzen? Wie benennen wir Ordner und Dateien um? Und schließlich: Wie übertragen wir diese Änderungen direkt auf das Dateisystem?
Voraussetzung
Wir bauen in diesem Artikel auf dem Beispielformular frmDateienImTreeView auf, das wir im Artikel Dateien schnell im TreeView-Steuerelement anzeigen (www.vbentwickler.de/0) bereits vorgestellt haben (siehe Bild 1).

Bild 1: TreeView-Steuerelement mit den Einträgen, mit denen wir arbeiten wollen
Ordner oder Dateien direkt im Windows Explorer anzeigen
Als Erstes wollen wir uns um die Anzeige eines Ordners oder einer Datei direkt im Windows Explorer kümmern.
Diese Funktionen werden wir später in verschiedenen Kontexten aufrufen – das Anzeigen eines Ordners über das Kontextmenü und das Anzeigen einer Datei im Windows Explorer über das Kontextmenü oder per Doppelklick auf das jeweilige Datei-Element im TreeView-Steuerelement.
Ordner direkt im Windows Explorer anzeigen
Die Prozedur zum Anzeigen eines Ordners im Windows Explorer ist denkbar einfach. Wir müssen nur die Anwendung Explorer.exe aufrufen und dieser den Pfad des anzuzeigenden Ordners übergeben. Außerdem können wir noch angeben, in welchem Fenstermodus der Windows Explorer geöffnet werden soll – hier wählen wir standardmäßig die normale Ansicht.
Die Prozedur OpenFolderInExplorer nimmt den Pfad des anzuzeigenden Ordners als Parameter entgegen:
Public Sub OpenFolderInExplorer(strPath As String) Shell "explorer.exe """ & strPath & """", _ vbNormalFocus End Sub
Sie ruft die VBA-Funktion Shell auf und übergibt den in Anführungszeichen eingefassten Pfad als Parameter.
Wenn wir etwa den Pfad des aktuellen Datenbankverzeichnisses anzeigen wollen, rufen wir die Prozedur beispielsweise wie folgt auf:
Call OpenFolderInExplorer(CurrentProject.Path)
Datei direkt im Windows Explorer anzeigen
Wir können noch einen Schritt weitergehen und direkt eine Datei im Windows Explorer markieren. Die entsprechende Prozedur nennen wir ShowFileInExplorer:
Public Sub ShowFileInExplorer(strPath As String) Shell "explorer.exe /select,""" & strPath & """", _ vbNormalFocus End Sub
Sie verwendet vor der Angabe des Pfades zu der zu markierenden Datei den Parameter /select.
Diese Prozedur rufen wir beispielsweise für die aktuelle Datenbankdatei wie folgt auf:
Call ShowFileInExplorer(CurrentDb.name)
Datei mit der jeweiligen Anwendung öffnen
Die Prozedur, mit der wir eine Datei direkt in der jeweiligen Anwendung öffnen können, heißt OpenFile und verwendet die Methode FollowHyperlink des Application-Objekts:
Public Sub OpenFile(strPath As String) Application.FollowHyperlink strPath End Sub
Um zum Beispiel eine Bilddatei aus dem aktuellen Datenbankverzeichnis anzuzeigen, nutzen wir den folgenden Aufruf:
Call OpenFile(CurrentProject.Path & "\pic005.png")
Angeklicktes Node-Element ermitteln
Für verschiedene Aktionen müssen wir zuvor das angeklickte Node-Element referenzieren – zum Beispiel, wenn wir eine Aktion beim Doppelklick darauf ausführen wollen.
Also deklarieren wir im Kopf des Klassenmoduls eine Variable, um das aktuelle Element zu referenzieren:
Dim objCurrentNode As MSComctlLib.Node
Wenn der Benutzer auf ein Node-Element klickt, soll dieses mit objCurrentNode referenziert werden. Wenn der Benutzer auf einen freien Bereich im TreeView-Steuerelement klickt, soll die Objektvariable objCurrentNode geleert werden.
Das erledigen wir mit der Ereignisprozedur, die beim Herunterdrücken der Maustaste ausgelöst wird. Wir legen die entsprechende Prozedur an, indem wir im Codefenster im linken Auswahlfeld den Eintrag ctlTreeView auswählen und im rechten Auswahlfeld MouseDown.
Die so angelegte Prozedur füllen wir mit den folgenden Anweisungen:
Private Sub ctlTreeView_MouseDown( _ ByVal Button As Integer, ByVal Shift As Integer, _ ByVal x As Long, ByVal y As Long) Set objCurrentNode = ctlTreeView.Object.HitTest(x, y) If objCurrentNode Is Nothing Then Me.ctlTreeView.Object.SelectedItem = Nothing End If End Sub
Die Prozedur erhält mit den Parametern X und Y die beim Klicken mit der Maus gültigen Koordinaten des Mauszeigers. Diese werten wir mit der Eigenschaft HitTest aus.
Wenn der Benutzer ein Node-Element angeklickt hat, wird ein Verweis darauf zurückgeliefert. Wenn nicht, ist nicht nur objCurrentNode leer, sondern wir wollen dann auch den aktuell markierten Eintrag abwählen. Dazu stellen wir die Eigenschaft SelectedItem auf Nothing ein.
Aktuell markierte Datei per Doppelklick öffnen
Wenn wir die Funktion OpenFile per Doppelklick auf einen der Datei-Einträge im TreeView-Steuerelement aufrufen wollen, benötigen wir das Ereignis DblClick. Dieses liefert keinerlei Parameter, die eine Information über das angeklickte Node-Element enthalten.
Deshalb haben wir die zuvor erläuterte Ereignisprozedur angelegt. Klicken wir nun doppelt auf eines der Elemente, erhalten wir den Verweis auf das angeklickte Node-Element über die Objektvariable objCurrentNode. Wenn der Benutzer einen Doppelklick außerhalb der Node-Elemente durchgeführt hat, ist objCurrentNode leer.
Diese Variable werten wir in der folgenden Ereignisprozedur aus. Nur wenn objCurrentNode nicht Nothing ist, ermitteln wir den Key aus der Key-Eigenschaft und lesen darauf mit Left das erste Zeichen aus, das entweder f (Folder) oder i (File) lautet.
Der Doppelklick soll nur etwas bewirken, wenn wir eine Datei angeklickt haben – im Falle eines Doppelklicks auf einen Ordner soll nur das Standardverhalten ausgelöst werden, in diesem Fall das Aufklappen der untergeordneten Elemente.
Wir haben in den Tabellen tblFolders und tblFiles nur die Namen des jeweiligen Ordners oder der Datei gespeichert, nicht den vollständigen Pfad zum entsprechenden Element.
Deshalb müssen wir, um die doppelt angeklickte Datei zu öffnen, erst den Pfad ermitteln. Dazu nutzen wir die Funktion GetFilePath, der wir die ID der Datei aus dem Key übergeben. Nachdem wir damit den Pfad ermittelt haben, können wir die Funktion OpenFile aufrufen und mit dieser die Datei mit dem entsprechenden Pfad öffnen:
Private Sub ctlTreeView_DblClick() Dim strPath As String Dim strKey As String If Not objCurrentNode Is Nothing Then strKey = objCurrentNode.Key Select Case Left(strKey, 1) Case "i" strPath = GetFilePath(Mid(strKey, 2)) Call OpenFile(strPath) End Select End If End Sub
Pfad zu einer Datei ermitteln
Die Funktion GetFilePath erwartet die ID der Datei aus der Tabelle tblFiles (siehe Listing 1). Sie liest zunächst die ID des übergeordneten Ordners aus dem Feld ParentID der Tabelle tblFiles aus. Dann trägt sie in die Variable strPath zunächst nur den Dateinamen dieser Datei ein.
Public Function GetFilePath(ByVal lngFileID As Long) As String Dim lngFolderID As Long Dim strPath As String Dim strFolder As String lngFolderID = Nz(DLookup("ParentID", "tblFiles", "FileID = " & lngFileID), 0) strPath = Nz(DLookup("Filename", "tblFiles", "FileID = " & lngFileID), 0) Do While Not lngFolderID = 0 strFolder = Nz(DLookup("Foldername", "tblFolders", "FolderID = " & lngFolderID), 0) strPath = strFolder & "\" & strPath lngFolderID = Nz(DLookup("ParentID", "tblFolders", "FolderID = " & lngFolderID), 0) Loop strPath = DLookup("Basispfad", "tblOptionen") & "\" & strPath GetFilePath = strPath End Function
Listing 1: Die Funktion GetFilePath holt den Pfad zu dem Ordner oder der Datei mit der angegebenen ID.
In der folgenden Do While-Schleife, die so lange durchlaufen wird, bis es keinen übergeordneten Ordner mehr gibt (lngFolder = 0) liest die Prozedur zunächst den Namen des übergeordneten Ordners aus der Tabelle tblFolders in die Variable strFolder ein.
Dann fügt sie diesen Namen, getrennt durch einen Backslash, vorn an den Inhalt der Variablen strPath an und speichert das Ergebnis wieder in strPath. Außerdem ermittelt sie nun die ID des übergeordneten Elements für diesen Ordner aus der Tabelle tblFolders und schreibt diese in lngFolderID.
Auf diese Weise entsteht ein Pfad wie Dir03\Dir0303\Test030303.txt. Da wir die Ordner und Dateien immer von dem im Feld Basisordner der Tabelle tblOptionen aus in den Tabellen tblFolders und tblFiles speichern, müssen wir nun nur noch den dort gespeicherten Pfad hinzufügen, um den vollständigen Pfad zu erhalten.
Diesen gibt die Funktion als Ergebnis zurück.
Kontextmenü im TreeView-Steuerelement anzeigen
Wenn wir nicht nur Dateien öffnen, sondern diese und auch Ordner im Windows Explorer anzeigen wollen, benötigen wir ein Kontextmenü. Allein mit Klick-Befehlen lässt sich dies nicht so realisieren, dass es für den Benutzer noch intuitiv ist.
Also fügen wir ein Kontextmenü hinzu, das je nach Position des Klicks unterschiedliche Optionen haben soll.
Beim Klick auf einen Ordner sollen folgende Befehle erscheinen. Alle Befehle sollen später mit dem Pendant für die entsprechende Aktion im „echten“ Dateisystem ausgestattet werden:
- Neuer Ordner: Legt einen neuen Ordner-Node namens Neuer Ordner an und aktiviert direkt das Umbenennen des neuen Ordners.
- Ordner löschen: Löscht den Ordner-Node.
- Ordner kopieren: Kopiert den Ordner-Node.
- Ordner ausschneiden: Kopiert den Ordner-Node und löscht diesen, sobald er an anderer Stelle eingefügt wurde.
- Einfügen: Fügt einen Ordner- oder Datei-Node, der zuvor kopiert oder ausgeschnitten wurde, in diesem Ordner ein.
- Ordner im Windows Explorer öffnen: Öffnet den Ordner im Windows-Explorer.
- Dateipfad kopieren: Kopiert den Dateipfad des Ordners in die Zwischenablage.
- Ordner umbenennen: Versetzt das Element in den Umbenennen-Modus
Beim Klick auf eine Datei sind diese Befehle vorgesehen:
- Datei löschen: Löscht den Node.
- Datei kopieren: Kopiert den Node in die Zwischenablage.
- Datei ausschneiden: Kopiert den Node in die Zwischenablage und löscht ihn, sobald dieser an anderer Stelle eingefügt wurde.
- Datei im Explorer öffnen: Zeigt die Datei im Explorer an.
- Datei in Zielanwendung öffnen: Öffnet die Datei in der für diese festgelegten Standardanwendung.
Und beim Klick auf den leeren Raum außerhalb der Node-Elemente bieten wir diese Befehle an:
- Neuer Ordner: Legt einen neuen Ordner namens Neuer Ordner an und aktiviert den Umbenennen-Modus.
Kontextmenüs anlegen
Kontextmenüs legen wir auf dem herkömmlichen Wege über die CommandBars-Auflistung an. Um diese anzuzeigen, verwenden wir die MouseDown-Eigenschaft des TreeView-Steuerelements. Dazu erweitern wir die bereits vorhandene Ereignisprozedur wie in Listing 2.
Private Sub ctlTreeView_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Long, ByVal y As Long) Dim strTyp As String Set objCurrentNode = ctlTreeView.Object.HitTest(x, y) If objCurrentNode Is Nothing Then Me.ctlTreeView.Object.SelectedItem = Nothing End If Select Case Button Case acRightButton If Not objCurrentNode Is Nothing Then strTyp = Left(objCurrentNode.Key, 1) Select Case strTyp Case "f" Call CreateCommandBarFolder() Case "i" Call CreateCommandBarFile() End Select Else Call CreateCommandBarOther End If End Select End Sub
Listing 2: Prozedur zum Aufruf der verschiedenen Kontextmenüs
Das Ergebnis soll beispielsweise für Ordner-Elemente wie in Bild 2 aussehen.

Bild 2: Anzeigen des Kontextmenüs für einen Ordner
Wir ermitteln hier nach wie vor das aktuell markierte Node-Element. Dann prüfen wir, ob der Benutzer die rechte Maustaste betätigt hat (acRightButton). Ist das der Fall, prüfen wir, ob aktuell ein Node-Element markiert ist.
Falls ja, lesen wir aus der Key-Eigenschaft das erste Zeichen aus. Im Falle von f (Folder) rufen wir die Prozedur CreateCommandBarFolder auf und übergeben den Verweis auf das aktuelle Node-Element. Lautet der Buchstabe i (File), rufen wir CreateCommandBarFile auf. Falls gerade kein Node-Element markiert ist, rufen wir die Prozedur CreateCommandBarOther auf.
Kontextmenü für Ordner anzeigen
Die Prozedur CreateCommandBarFolder soll das Kontextmenü für einen Ordner anzeigen (siehe Listing 3).
Private Sub CreateCommandBarFolder() Dim strKey As String Dim cbr As Office.CommandBar strKey = objCurrentNode.Key On Error Resume Next CommandBars("Ordner").Delete On Error GoTo 0 Set cbr = CommandBars.Add("Ordner", msoBarPopup, False, True) With cbr.Controls.Add(msoControlButton) .Caption = "Ordner kopieren" .OnAction = "=OrdnerKopieren(''" & strKey & "'')" .FaceId = 1667 End With With cbr.Controls.Add(msoControlButton) .Caption = "Ordner ausschneiden" .OnAction = "=OrdnerAusschneiden(''" & strKey & "'')" .FaceId = 1669 End With With cbr.Controls.Add(msoControlButton) .Caption = "Ordner einfügen" .OnAction = "=OrdnerEinfuegen(''" & strKey & "'')" .FaceId = 22 End With With cbr.Controls.Add(msoControlButton) .Caption = "Ordner löschen" .OnAction = "=OrdnerLoeschen(''" & strKey & "'')" .FaceId = 2500 End With With cbr.Controls.Add(msoControlButton) .Caption = "Neuer Ordner" .OnAction = "=NeuerOrdner(''" & strKey & "'')" .FaceId = 1755 ''4088 ''4274 ''2031 '' End With With cbr.Controls.Add(msoControlButton) .Caption = "Ordner im Windows Explorer anzeigen" .OnAction = "=OrdnerExplorer(''" & strKey & "'')" .FaceId = 32 End With With cbr.Controls.Add(msoControlButton) .Caption = "Pfad des Ordners kopieren" .OnAction = "=OrdnerPfadKopieren(''" & strKey & "'')" .FaceId = 19 End With With cbr.Controls.Add(msoControlButton) .Caption = "Ordner umbenennen" .OnAction = "=OrdnerUmbenennen(''" & strKey & "'')" .FaceId = 2512 End With cbr.ShowPopup End Sub
Listing 3: Prozedur zum Anzeigen des Kontextmenüs für Ordner
Sie nimmt den Verweis auf das Node-Element entgegen, für welches das Kontextmenü angezeigt werden soll. Dann liest es die ID des Elements aus, für das es angezeigt werden soll.
Falls das Kontextmenü bereits vorhanden ist, löschen wir es bei deaktivierter Fehlerbehandlung zunächst mit der Delete-Methode.
Danach legen wir ein neues Kontextmenü namens Ordner an und legen den Typ auf msoBarPopup fest. Außerdem stellen wir den Parameter Temporary auf True ein, damit es beim Beenden der Access-Session anschließend wieder gelöscht wird
Anschließend führen wir für die zu erstellenden Kontextmenü-Einträge jeweils ähnliche Befehle aus. Wir haben uns hier aus Platzgründen entschieden, nicht wie sonst üblich für jeden Kontextmenü-Eintrag eine eigene Variable zu deklarieren, die man normalerweise zum anschließenden Zuweisen der Eigenschaften nutzt. Stattdessen nutzen wir die With-Anweisung direkt mit dem neu erstellten Element und weisen damit die drei Eigenschaften zu:
- Caption: Erwartet die Beschriftung des Kontextmenü-Eintrags.
- OnAction: Hier hinterlegen wir die beim Anklicken auszuführende Funktion, die wir in einem Standardmodul als öffentliche Funktion anlegen müssen.
- FaceID: Erwartet einen Zahlenwert für ein eingebautes Menüsymbol.
Für die Eigenschaft OnAction legen wir jeweils eine Zeichenkette fest, die den Funktionsnamen enthält sowie den Key des aktuell markierten Node-Elements aus der Variablen strKey, zum Beispiel:
.OnAction = "=OrdnerKopieren(''" & strKey & "'')"
Schließlich zeigen wir das Kontextmenü mit der Methode ShowPopup an.
Funktionen für das Ordner-Kontextmenü
Das warén die einfachen Aufgaben. Nun folgen die einzelnen Funktionen, die beim Anklicken der Kontextmenü-Einträge ausgelöst werden sollen.
Diese legen wir im Standardmodul mdlKontextmenues nach dem folgenden Schema an – hier für das Kopieren eines Ordners:
Public Function OrdnerKopieren(lngID As Long) MsgBox "Ordner kopieren" End Function
Wie wir diese Funktionen füllen, sehen wir in den folgenden Abschnitten.
Ordner und Datei ausschneiden, kopieren und einfügen
Was genau soll beim Ausschneiden, Kopieren und Einfügen von Ordnern geschehen? Wir wollen zunächst auf der Ebene des TreeView-Steuerelements arbeiten. Das Nachziehen der Vorgänge im Dateisystem fügen wir später hinzu.
Beim Ausschneiden und Kopieren müssen wir uns eigentlich nur die ID des jeweiligen Elements merken, da die eigentliche Aktion erst durchgeführt wird, wenn wir den Ordner an anderer Stelle einfügen.
Wie benötigen also eine öffentlich deklarierte Variable, in der wir uns merken, welches Element ausgeschnitten oder kopiert werden soll. Dazu speichern wir am besten einfach den Key des Elements in dieser Variablen. Außerdem müssen wir kenntlich machen, ob das Element mit diesem Key ausgeschnitten oder kopiert werden soll. Wir können dazu jeweils eine Variable wie strKeyOrdnerAusgeschnitten und strKeyOrdnerKopiert anlegen.
Dann müssten wir, wenn wir einen Ordner kopieren, den Key in die Variable strKeyOrdnerKopiert schreiben und die Variable strKeyOrdnerAusgeschnitten leeren und umgekehrt – wir können schließlich nur einen Einfügevorgang durchführen, also müssen wir wissen, ob gerade ein Ordner zum Ausschneiden oder Kopieren markiert wurde. Alternativ könnten wir einfach eine Variable namens strKeyAusgeschnittenOderKopiert anlegen und eine weitere Boolean-Variable, die angibt, ob ein Ordner ausgeschnitten oder kopiert werden soll. Wir entscheiden uns für die erste Variante:
Public strKeyOrdnerAusgeschnitten As String Public strKeyOrdnerKopiert As String
Folglich hinterlegen wir für die beiden Kontextmenü-Funktionen die folgenden Anweisungen:
Public Function OrdnerKopieren(strKey As String) strKeyOrdnerKopiert = strKey strKeyOrdnerAusgeschnitten = "" End Function Public Function OrdnerAusschneiden(strKey As String) strKeyOrdnerKopiert = "" strKeyOrdnerAusgeschnitten = strKey End Function
Einfügen eines ausgeschnittenen Ordners
Wenn wir mit der nächsten Funktion den Einfügevorgang durchführen wollen, benötigen wir Zugriff auf die TreeView-Objektvariable. Diese ziehen wir daher vom Klassenmodul in das Modul mdlGlobal und stellen die Sichtbarkeit auf Public ein:
Public objTreeview As MSComctlLib.TreeView
Wir beginnen mit dem Einfügen eines ausgeschnittenen Ordners, weil dies deutlich einfacher ist – auch wenn man es nicht glauben mag, denn das Ausschneiden besteht schließlich, oberflächlich betrachtet, aus zwei Schritten und das Kopieren scheinbar nur aus einem. Tatsächlich besteht das Ausschneiden aber nur im „Umhängen“ des Nodes an einen anderen Parent-Node.
Und, auch der Autor lernt nie aus, denn sogar das Einsortieren in die richtige Reihenfolge ist einfach: Elemente werden zwar beim Hinzufügen standardmäßig unten angehängt, und somit ist nicht gewährleistet, dass das verschobene Element korrekt in alphanumerischer Reihenfolge angelegt wird.
Mit der Eigenschaft Sorted können wir jedoch festlegen, dass die Einträge im TreeView-Steuerelement alphanumerisch sortiert werden. Damit diese Einstellung direkt zu Beginn angewendet wird, fügen wir die folgende Zeile zur Prozedur Form_Load hinzu:
objTreeView.Sorted = True
Schließlich müssen wir auch noch den Key des neuen übergeordneten Elements für den ausgeschnittenen und eingefügten Ordner-Datensatz in der Tabelle tblFolder definieren. Die beim Aufrufen des Kontextmenü-Befehls Einfügen ausgelöste Prozedur finden wir in Listing 4. Sie nimmt den Key des Zielelements als Parameter entgegen und prüft, ob es ein kopiertes Element in strKeyOrdnerAusgeschnitten gibt.
Public Function OrdnerEinfuegen(strKeyZiel As String) Dim objNodeAusgeschnittenOderKopiert As MSComctlLib.Node If Not Len(strKeyOrdnerAusgeschnitten) = 0 Then Set objNodeAusgeschnittenOderKopiert = objTreeview.Nodes(strKeyOrdnerAusgeschnitten) If Not objNodeAusgeschnittenOderKopiert Is Nothing Then If FS_OrdnerVerschieben(Mid(strKeyOrdnerAusgeschnitten, 2), Mid(strKeyZiel, 2)) = True Then Call ParentInOrdnertabelleAendern(Mid(objNodeAusgeschnittenOderKopiert.Key, 2), Mid(strKeyZiel, 2)) Set objNodeAusgeschnittenOderKopiert.Parent = objTreeview.Nodes(strKeyZiel) Else MsgBox "Ordner konnte im Dateisystem nicht verschoben werden.", vbOKOnly + vbCritical, "Fehler" End If End If Else ''... Kopierten Ordner einfügen End If objTreeview.Sorted = True End Function
Listing 4: Prozedur zum Einfügen eines Ordners
Ist das der Fall, referenziert sie das entsprechende Element über den Key und prüft abermals, ob dieses Element vorhanden ist. Falls ja, ruft sie die weiter unten beschriebene Funktion FS_OrdnerVerschieben auf und übergibt dieser die IDs des zu verschiebenden Ordners und des Zielordners. FS_OrdnerVerschieben gibt den Wert True zurück, wenn das Verschieben im Dateisystem erfolgreich war.
In diesem Fall ruft OrdnerEinfuegen die Prozedur ParentInOrdnertabelleAendern auf und übergibt dieser die ID des ausgeschnittenen Elements und die des neuen Parent-Elements als Parameter.
Außerdem stellt sie die Eigenschaft Parent des verschobenen Elements auf das neue übergeordnete Element ein.
Die Prozedur ParentInOrdnertabelleAendern nimmt die ID des zu verschiebenden Elements sowie die ID des neuen Parent-Elements entgegen und ändert den Datensatz der Tabelle tblFolders für den betroffenen Datensatz, indem sie den Wert des Feldes ParentID auf die ID des neuen übergeordneten Elements einstellt:
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo
