{"id":55001584,"date":"2026-02-01T00:00:00","date_gmt":"2026-02-06T13:36:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1584"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dateien_schnell_im_TreeViewSteuerelement_anzeigen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/","title":{"rendered":"Dateien schnell im TreeView-Steuerelement anzeigen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e\" width=\"1\" height=\"1\" alt=\"\"><b>Im Artikel &#8222;Ordner und Dateien in Access-Tabellen einlesen&#8220; (www.access-im-unternehmen.de\/1583) haben wir gezeigt, wie wir den Inhalt kompletter Ordner samt Unterordnern und Dateien in Tabellen speichern. Doch was helfen die dort liegenden Daten, wenn wir sie nicht in einem Access-Formular anzeigen k&ouml;nnen? Wie das gelingt, zeigen wir im vorliegenden Artikel. Als Steuerelement f&uuml;r die Anzeige hierarchischer Daten ist das TreeView-Steuerelement pr&auml;destiniert. Wir m&ouml;chten alle Elemente der Tabellen aus dem oben genannten Artikel in einem solchen Steuerelement anzeigen und weitere Funktionen hinzuf&uuml;gen: die Anzeige des jeweiligen Ordners direkt im Windows Explorer, das &Ouml;ffnen der aktuell markierten Datei oder auch das Ausschneiden, Kopieren und Einf&uuml;gen, das wir nicht nur auf die Elemente des TreeView-Steuerelements anwenden, sondern auch auf die Originaldateien. Auch das Umbenennen von Ordnern und Dateien soll m&ouml;glich sein &#8211; und schlie&szlig;lich wollen wir auch noch deren Speicherort durch Drag and Drop anpassen k&ouml;nnen. In diesem Artikel erf&auml;hrst Du erst einmal, wie Du das TreeView schnell mit Ordnern und Dateien f&uuml;llen kannst. <\/b><\/p>\n<h2>Formular mit TreeView-Steuerelement erstellen<\/h2>\n<p>Zun&auml;chst legen wir ein neues Formular namens <b>frmDateienImTreeview  <\/b>in der Entwurfsansicht an.<\/p>\n<p>Diesem f&uuml;gen wir gleich das <b>TreeView<\/b>-Steuerelement hinzu, mit dem wir die Dateien anzeigen wollen, und nennen es <b>ctlTreeView<\/b>.<\/p>\n<p>Das <b>TreeView<\/b>-Steuerelement soll f&uuml;r seine Eintr&auml;ge Icons anzeigen, daher f&uuml;gen wir noch ein <b>ImageList<\/b>-Steuerelement namens <b>ctlImageList <\/b>hinzu. Oben f&uuml;gen wir weitere Steuerelemente ein:<\/p>\n<ul>\n<li>ein Textfeld namens <b>txtBasispfad<\/b> zur Anzeige des aktuellen Hauptverzeichnisses,<\/li>\n<li>eine Schaltfl&auml;che namens <b>cmdOrdnerAuswaehlen<\/b> zum Ausw&auml;hlen des Hauptverzeichnisses, dessen Unterordner und Dateien angezeigt werden sollen,<\/li>\n<li>ein Kontrollk&auml;stchen namens <b>chkDateienImTreeViewAnzeigen<\/b>, um festzulegen, ob die Dateien im <b>TreeView<\/b>-Steuerelement ein- oder ausgeblendet werden sollen, und<\/li>\n<li>eine weitere Schaltfl&auml;che namens <b>cmdNeuEinlesen<\/b>, mit der wir das <b>TreeView<\/b>-Steuerelement erneut f&uuml;llen k&ouml;nnen.<\/li>\n<\/ul>\n<p>Der Entwurf sieht nun zun&auml;chst wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_01\/pic_1584_001.png\" alt=\"Grundaufbau des Formulars\" width=\"599,6265\" height=\"549,2295\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Grundaufbau des Formulars<\/span><\/b><\/p>\n<h2>Optionentabelle anlegen<\/h2>\n<p>Die Einstellungen der beiden Steuerelemente <b>txtBasispfad <\/b>und <b>chkDateienImTreeViewAnzeigen <\/b>wollen wir speichern und jeweils beim n&auml;chsten &Ouml;ffnen des Formulars wiederherstellen. Dazu ben&ouml;tigen wir eine Tabelle namens <b>tblOptionen<\/b>, deren Entwurf wie in Bild 2 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_01\/pic_1584_002.png\" alt=\"Entwurf der Optionen-Tabelle\" width=\"624,6265\" height=\"381,9312\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Optionen-Tabelle<\/span><\/b><\/p>\n<p>Das Formular binden wir &uuml;ber die Eigenschaft Datensatzquelle an die Tabelle <b>tblOptionen<\/b>, die beiden Steuerelemente <b>txtBasispfad <\/b>und <b>chkDateienImTreeViewAnzeigen <\/b>&uuml;ber die Eigenschaft <b>Steuerelementinhalt <\/b>an die jeweiligen Felder der Optionentabelle.<\/p>\n<h2>Basispfad ausw&auml;hlen<\/h2>\n<p>Damit wir den Ordner ausw&auml;hlen k&ouml;nnen, dessen Unterordner und Dateien im <b>TreeView<\/b>-Steuerelement angezeigt werden sollen, hinterlegen wir f&uuml;r die Schaltfl&auml;che <b>cmdOrdnerAuswaehlen <\/b>die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOrdnerAuswaehlen_Click()\r\n     Me.txtBasispfad = ChooseFolder\r\n     Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese zeigt &uuml;ber die Funktion <b>ChooseFolder <\/b>einen Ordnerauswahl-Dialog an:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ChooseFolder()\r\n     <span style=\"color:blue;\">Dim <\/span>objFileDialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objFileDialog = _\r\n         Application.FileDialog(msoFileDialogFolderPicker)\r\n     <span style=\"color:blue;\">With<\/span> objFileDialog\r\n         .Title = \"Datei ausw&auml;hlen\"\r\n         .ButtonName = \"Ausw&auml;hlen\"\r\n         .InitialFilename = CurrentProject.Path & \"\\\"\r\n         <span style=\"color:blue;\">If <\/span>.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = .SelectedItems(1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ChooseFolder = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Um die hier verwendete Klasse <b>FileDialog <\/b>zu nutzen, m&uuml;ssen wir noch einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>hinzuf&uuml;gen.<\/p>\n<p>Nach der Auswahl werden die Daten des Formulars mit <b>Me.Dirty = False <\/b>gespeichert.<\/p>\n<h2>F&uuml;llen des TreeView-Steuerelements<\/h2>\n<p>Bevor wir uns die Prozeduren ansehen, mit denen wir die Ordner und Dateien aus den Tabellen <b>tblFolders <\/b>und <b>tblFiles <\/b>in das <b>TreeView<\/b>-Steuerelement laden, f&uuml;gen wir im Kopf des Klassenmoduls des Formulars <b>frmDateienImTreeView <\/b>die folgenden Deklarationsanweisungen hinzu:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objTreeview<span style=\"color:blue;\"> As <\/span>MSComctlLib.TreeView\r\n<span style=\"color:blue;\">Dim <\/span>objImageList<span style=\"color:blue;\"> As <\/span>MSComctlLib.ImageList\r\n<span style=\"color:blue;\">Dim <\/span>dicFolders<span style=\"color:blue;\"> As <\/span>Scripting.Dictionary\r\n<span style=\"color:blue;\">Dim <\/span>dicFiles<span style=\"color:blue;\"> As <\/span>Scripting.Dictionary<\/pre>\n<p>Die ersten beiden ben&ouml;tigen wir, um die Steuerelemente <b>ctlTreeView <\/b>und <b>ctlImageList <\/b>zu referenzieren, die beiden &uuml;brigen als tempor&auml;ren Speicher f&uuml;r die anzuzeigenden Ordner und Dateien. Um diese <b>Dictionary<\/b>-Elemente nutzen zu k&ouml;nnen, ben&ouml;tigen wir einen weiteren Verweis, dieses Mal auf die Bibliothek <b>Microsoft Scripting Runtime<\/b>.<\/p>\n<h2>Die Ereignisprozedur Beim Laden<\/h2>\n<p>In der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird (siehe Listing 1), aktivieren wir zun&auml;chst die Sanduhr (die wir am Ende wieder deaktivieren) und weisen der Variablen <b>objImageList <\/b>die Eigenschaft <b>Object <\/b>des Steuerelements <b>ctlImageList <\/b>zu. Damit k&ouml;nnen wir per IntelliSense auf die spezifischen Eigenschaften dieses Steuerelements zugreifen. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n    \r\n     DoCmd.Hourglass <span style=\"color:blue;\">True<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objImageList = Me.ctlImageList.Object\r\n     \r\n     objImageList.ImageHeight = 16\r\n     objImageList.ImageWidth = 16\r\n     <span style=\"color:blue;\">Call<\/span> ImageListFuellen\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objTreeview = Me.ctlTreeView.Object\r\n     <span style=\"color:blue;\">With<\/span> objTreeview\r\n         <span style=\"color:blue;\">Set<\/span> .ImageList = objImageList\r\n         .Nodes.Clear\r\n         .Appearance = ccFlat\r\n         .BorderStyle = ccNone\r\n         .HideSelection = <span style=\"color:blue;\">False<\/span>\r\n         .LineStyle = tvwRootLines\r\n         .Indentation = 250\r\n         .Font.name = \"Calibri\"\r\n         .Font.Size = 10\r\n         .OLEDragMode = ccOLEDragAutomatic\r\n         .OLEDropMode = ccOLEDropManual\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     \r\n     <span style=\"color:blue;\">Call<\/span> FillTreeView(Me.chkDateienInTreeviewAnzeigen)\r\n     <span style=\"color:blue;\">Call<\/span> SelectCurrentNode\r\n     \r\n     DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur wird beim Laden des Formulars ausgef&uuml;hrt.<\/span><\/b><\/p>\n<p>Dann stellen wir seine Eigenschaften <b>ImageHeight <\/b>und <b>ImageWidth <\/b>jeweils auf 16 Pixel ein, um die Gr&ouml;&szlig;e der anzuzeigenden Icons festzulegen. Schlie&szlig;lich rufen wir die Prozedur <b>ImageListFuellen <\/b>auf (siehe Listing 2). Diese geht davon aus, dass wir die Icons, die wir im <b>TreeView<\/b>-Steuerelement anzeigen wollen, in der Systemtabelle <b>MSysResources <\/b>gespeichert haben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ImageListFuellen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>objImageList<span style=\"color:blue;\"> As <\/span>MSComctlLib.ImageList\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM MSysResources WHERE Extension = ''PNG''\", dbOpenSnapshot)\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objImageList = Me.ctlImageList.Object\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> ctlTreeView.Object.ImageList = Nothing\r\n     \r\n     objImageList.ListImages.Clear\r\n     \r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Call<\/span> amvAddIconToImageListFromResourcesByName(objImageList, rst!name)\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     \r\n     <span style=\"color:blue;\">Dim <\/span>objListImage<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListImage\r\n     For Each objListImage In objImageList.ListImages\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objListImage.Index, objListImage.Key\r\n     <span style=\"color:blue;\">Next<\/span> objListImage\r\n         \r\n     rst.Close\r\n     <span style=\"color:blue;\">Set<\/span> rst = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: F&uuml;llen des ImageList-Steuerelements mit den Bildern aus MSysResources<\/span><\/b><\/p>\n<p>Das haben wir bereits erledigt (siehe Bild 3). Die Prozedur <b>ImageListFuellen <\/b>&ouml;ffnet ein Recordset basierend auf der Tabelle <b>MSysResources<\/b>, gefiltert nach den Elementen des Typs <b>png<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_01\/pic_1584_003.png\" alt=\"Icons f&uuml;r das TreeView-Steuerelement in der Tabelle MSysResources\" width=\"499,6267\" height=\"239,7403\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Icons f&uuml;r das TreeView-Steuerelement in der Tabelle MSysResources<\/span><\/b><\/p>\n<p>Dann referenziert sie das <b>ImageList<\/b>-Steuerelement mit der bereits im Modulkopf deklarierten Variablen <b>objImageList<\/b>. Anschlie&szlig;end wird die Eigenschaft <b>ImageList <\/b>des Steuerelements <b>ctlTreeView <\/b>geleert &#8211; dieses wird sp&auml;ter erneut zugewiesen.<\/p>\n<p>Dann leert die Prozedur das <b>ImageList<\/b>-Steuerelement mit der <b>Clear<\/b>-Methode der <b>ListImages<\/b>-Auflistung. Dann ruft die Prozedur eine weitere Prozedur namens <b>amvAddIconToImageListFromResourcesByName <\/b>auf.<\/p>\n<p>Diese wollen wir hier nicht im Detail beschreiben &#8211; sie l&auml;dt das Element mit dem Namen aus <b>rst!Name<\/b> f&uuml;r den aktuellen Datensatz des Recordsets und f&uuml;gt es zum <b>ImageList<\/b>-Steuerelement hinzu (siehe Modul <b>MDL_AMV_Pictures<\/b>). Auf diese Weise landen alle <b>.png<\/b>-Dateien aus der Tabelle <b>MSysResources <\/b>im <b>ImageList<\/b>-Steuerelement und k&ouml;nnen so im <b>TreeView<\/b>-Steuerelement verwendet werden.<\/p>\n<p>Um dies nicht im <b>ImageList<\/b>-Steuerelement pr&uuml;fen zu m&uuml;ssen, gibt die Prozedur den Index und die Namen aller Elemente einmal im Direktbereich des VBA-Editors aus &#8211; diesen Bereich k&ouml;nnen wir im produktiven Einsatz sp&auml;ter entfernen. Das Ergebnis sieht in diesem Fall wie folgt aus:<\/p>\n<pre>  1            book\r\n  2            folder\r\n  3            new\r\n  4            delete\r\n  5            refresh<\/pre>\n<p>Danach schlie&szlig;t und leert die Prozedur alle Objektvariablen.<\/p>\n<p>Zur&uuml;ck in der Prozedur <b>Form_Load <\/b>referenzieren wir nun das <b>TreeView<\/b>-Steuerelement aus <b>Me.ctlTreeView.Object <\/b>mit der Variablen <b>objTreeView<\/b> und stellen einige Eigenschaften ein. Als Erstes weisen wir diesem f&uuml;r die Eigenschaft <b>ImageList <\/b>den Inhalt von <b>objImageList <\/b>zu. So wei&szlig; das <b>TreeView<\/b>-Steuerelement, woher es seine Icons beziehen soll, die wir nachher den Elementen zuweisen.<\/p>\n<p>Dann leert die Prozedur alle gegebenenfalls noch vorhandenen Elemente. Schlie&szlig;lich folgt die Einstellung weiterer Eigenschaften, die f&uuml;r das Aussehen des <b>TreeView<\/b>-Steuerelements verantwortlich sind:<\/p>\n<ul>\n<li>Appearance erh&auml;lt den Wert <b>ccFlat<\/b>, damit es nicht mit 3d-Effekt angezeigt wird,<\/li>\n<li>mit <b>BorderStyle <\/b>(Wert: <b>ccNone<\/b>) blenden wir den Rahmen des Steuerelements aus (wir f&uuml;gen diesen &uuml;ber die Eigenschaften des Steuerelements selbst &uuml;ber das Eigenschaftenblatt wieder hinzu),<\/li>\n<li>mit <b>HideSelection <\/b>(<b>False<\/b>) legen wir fest, dass das aktivierte Element auch beim Fokusverlust zumindest grau hinterlegt wird,<\/li>\n<li>mit <b>LineStyle <\/b>(<b>tvwRootLines<\/b>) legen wir die Art der Verbindungslinien zwischen den Elementen fest,<\/li>\n<li><b>Indentation <\/b>stellen wir auf <b>250 <\/b>ein, damit die Elemente nicht so weit einger&uuml;ckt werden wie im Standard,<\/li>\n<li>mit <b>Font.Name <\/b>und<b> Font.Size <\/b>stellen wir Schriftart und -gr&ouml;&szlig;e fest und <\/li>\n<li>mit <b>OLEDragMode <\/b>(<b>ccOLEDragAutomatic<\/b>) und <b>OLEDropMode <\/b>(<b>ccOLEDropManual<\/b>) legen wir fest, dass wir das Verhalten bei Drag and Drop selbst programmieren wollen.<\/li>\n<\/ul>\n<p>Schlie&szlig;lich rufen wir die Prozedur <b>FillTreeView <\/b>auf, die das eigentliche F&uuml;llen des <b>TreeView<\/b>-Steuerelements initialisiert.<\/p>\n<p>Dieser &uuml;bergeben wir als Parameter den Wert des Kontrollk&auml;stchens <b>chkDateienInTreeviewAnzeigen<\/b>, das angibt, ob nur Ordner oder auch Dateien im TreeView angezeigt werden sollen.<\/p>\n<p>Anschlie&szlig;end markierten wir noch das Element, das zuletzt selektiert wurde (mehr dazu sp&auml;ter).<\/p>\n<h2>F&uuml;llen des TreeView-Steuerelements mit FillTreeView<\/h2>\n<p>Den Start beim F&uuml;llen des <b>TreeView<\/b>-Steuerelements macht die Prozedur <b>FillTreeView<\/b>, der wir einen Boolean-Wert &uuml;bergeben, der angibt, ob neben den Ordnern auch Dateien angezeigt werden sollen oder nicht (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FillTreeView(<span style=\"color:blue;\">Optional<\/span> bolFiles<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> dicFolders = <span style=\"color:blue;\">New<\/span> Scripting.Dictionary\r\n     <span style=\"color:blue;\">Set<\/span> dicFiles = <span style=\"color:blue;\">New<\/span> Scripting.Dictionary\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT FolderID, Foldername, ParentID, Expanded FROM qryFoldersFolderUserData\", _\r\n         dbOpenSnapshot)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         AddFolderToDictionary rst!ParentID, rst!FolderID, rst!FolderName, rst!Expanded\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     rst.Close\r\n     \r\n     <span style=\"color:blue;\">If <\/span>bolFiles = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT FileID, Filename, ParentID FROM tblFiles ORDER BY Filename\", dbOpenSnapshot)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n             AddFileToDictionary rst!ParentID, rst!FileID, rst!FileName\r\n             rst.Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         rst.Close\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     BuildTree Null, Nothing\r\n     \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: F&uuml;llen des TreeView-Steuerelements mit FillTreeView<\/span><\/b><\/p>\n<p>Diese Prozedur und die dadurch aufgerufenen Routinen sind auf Performance getrimmt. Das hei&szlig;t, wir durchlaufen die Datens&auml;tze der Tabellen <b>tblFolders <\/b>und <b>tblFiles <\/b>nicht wie sonst &uuml;blich rekursiv und f&uuml;gen Ordner f&uuml;r Ordner und Datei f&uuml;r Datei zum <b>TreeView<\/b>-Steuerelement hinzu, sondern nutzen eine andere Vorgehensweise. Dazu f&uuml;llen wir zun&auml;chst die beiden Variablen <b>dicFolders <\/b>und <b>dicFiles<\/b>, die wir bereits im Kopf des Moduls deklariert haben, mit neuen, leeren <b>Dictionary<\/b>-Objekten.<\/p>\n<h2>Ordner in Dictionary einlesen<\/h2>\n<p>Dann durchlaufen wir alle Datens&auml;tze der Tabelle <b>tblFolder<\/b>, aber wir nutzen dazu eine vorgeschaltete Abfrage namens <b>qryFoldersFolderUserData<\/b> (siehe Bild 4). Diese fasst die Daten der Tabelle <b>tblFolders <\/b>mit denen der Tabelle <b>FolderUserData <\/b>zusammen &#8211; hier legen wir etwa fest, ob ein Ordner ausgeklappt angezeigt werden soll. Au&szlig;erdem sortiert die Abfrage direkt aufsteigend nach dem Feld <b>Foldername<\/b>, damit diese sp&auml;ter in der korrekten Reihenfolge eingelesen werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_01\/pic_1584_004.png\" alt=\"Abfrage mit Ordnern und der Information, ob ein Ordner ausgeklappt angezeigt werden soll\" width=\"499,6267\" height=\"344,6623\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Abfrage mit Ordnern und der Information, ob ein Ordner ausgeklappt angezeigt werden soll<\/span><\/b><\/p>\n<p>Recordsets &ouml;ffnen wir hier &uuml;brigens immer mit dem Parameter <b>dbOpenSnapshot<\/b>, da wir immer nur lesen zugreifen und dies schneller ist.<\/p>\n<p>Wir durchlaufen alle Elemente des Recordsets und rufen f&uuml;r jedes die Prozedur <b>AddFolderToDictionary <\/b>auf (siehe Listing 4). Wir beabsichtigen n&auml;mlich nicht, die Elemente direkt zum <b>TreeView<\/b>-Steuerelement hinzuzuf&uuml;gen, sondern diese erst im Dictionary <b>dicFolders <\/b>zwischenspeichern.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AddFolderToDictionary(varParentID<span style=\"color:blue;\"> As Variant<\/span>, lngFolderID<span style=\"color:blue;\"> As Long<\/span>, strFolderName<span style=\"color:blue;\"> As String<\/span>, _\r\n         bolExpanded<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> dicFolders.Exists(Nz(varParentID, 0))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection\r\n         dicFolders.Add Nz(varParentID, 0), col\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     dicFolders(Nz(varParentID, 0)).Add Array(lngFolderID, strFolderName, bolExpanded)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Speichern der Ordner und weiterer Daten im Dictionary dicFolders<\/span><\/b><\/p>\n<p>Diese Prozedur nimmt die ID des &uuml;bergeordneten Elements, die ID des Ordners, den Namen des Ordners sowie den Wert der Eigenschaft <b>Expanded <\/b>entgegen.<\/p>\n<p>Dann pr&uuml;ft sie, ob im Dictionary <b>dicFolders <\/b>bereits ein Element existiert, das dem Wert aus dem Parameter<b> varParentID <\/b>entspricht.<\/p>\n<p>Falls nicht, wird eine neue Collection angelegt und als neues Element in <b>dicFolders <\/b>mit dem Index aus <b>Nz(varParentID, 0) <\/b>angelegt &#8211; wobei <b>varParentID <\/b>f&uuml;r Ordner der obersten Ebene <b>Null <\/b>lautet und durch <b>Nz <\/b>stattdessen der Wert <b>0 <\/b>eingetragen wird.<\/p>\n<p>Dann f&uuml;gen wir zu dem Element von <b>dicFolders <\/b>f&uuml;r die aktuelle <b>ParentID <\/b>ein Array hinzu, das alle Informationen zu dem anzuzeigenden Ordner enth&auml;lt. Die drei Elemente des Arrays kommen aus den Parametern <b>lngFolderID<\/b>, <b>strFoldername <\/b>und <b>bolExpanded<\/b>.<\/p>\n<p>Auf diese Weise f&uuml;gen wir also einen zweistufigen Container f&uuml;r die sp&auml;ter in das <b>TreeView<\/b>-Steuerelement zu schreibenden Daten zusammen &#8211; die erste Stufe, das <b>Dictionary<\/b>-Objekt <b>dicFolders <\/b>enth&auml;lt als Index die <b>ParentID <\/b>und als eigentlichen Inhalt das <b>Collection<\/b>-Objekt <b>col<\/b>. <\/p>\n<p>Dieses wiederum enth&auml;lt f&uuml;r den Ordner mit der angegebenen Parent-ID jeweils einen Eintrag, bestehend aus einem Array mit der ID des Ordners, dem Namen des Ordners und dem <b>Boolean<\/b>-Wert, ob der Ordner ausgeklappt angezeigt werden soll. Das sieht ungef&auml;hr so aus:<\/p>\n<pre>ParentID: 0\r\n     FolderID: 1 FolderName: Dir01 Expanded: <span style=\"color:blue;\">False<\/span>\r\n     FolderID: 2 FolderName: Dir02 Expanded: <span style=\"color:blue;\">False<\/span>\r\n     FolderID: 3 FolderName: Dir03 Expanded: <span style=\"color:blue;\">True<\/span>    \r\nParentID: 1\r\n     FolderID: 4 FolderName: Dir0101 Expanded: <span style=\"color:blue;\">False<\/span>\r\n...<\/pre>\n<h2>Dateien in Dictionary einlesen<\/h2>\n<p>Das Gleiche erledigen wir anschlie&szlig;end mit den Eintr&auml;gen f&uuml;r die Dateien aus der Tabelle <b>tblFiles<\/b>.<\/p>\n<p>Dabei durchlaufen wir in der Prozedur <b>FillTreeView <\/b>ein Recordset &uuml;ber alle Datens&auml;tze der Tabelle <b>tblFiles<\/b>, wobei wir diese wieder sortieren, dieses Mal allerdings direkt im Parameter der <b>OpenRecordset<\/b>-Methode.<\/p>\n<p>Die Dateien werden allerdings nur eingelesen, wenn der Parameter <b>bolFiles <\/b>den Wert <b>True <\/b>hat, wenn das <b>TreeView<\/b>-Steuerelement also nicht nur Ordner, sondern auch Dateien anzeigen soll.<\/p>\n<p>Beim Durchlaufen der Datens&auml;tze rufen wir f&uuml;r jeden Datensatz die Prozedur <b>AddFileToDictionary<\/b> aus Listing 5 auf. Diese erwartet &auml;hnliche Parameter wie <b>AddFolderToDictionary<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AddFileToDictionary(varParentID<span style=\"color:blue;\"> As Variant<\/span>, lngFileID<span style=\"color:blue;\"> As Long<\/span>, strFileName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n     \r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> dicFiles.Exists(Nz(varParentID, 0))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection\r\n         dicFiles.Add Nz(varParentID, 0), col\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     dicFiles(Nz(varParentID, 0)).Add Array(lngFileID, strFileName)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Speichern der Dateien im Dictionary dicFiles<\/span><\/b><\/p>\n<ul>\n<li><b>varParentID<\/b>: ID des &uuml;bergeordneten Ordners<\/li>\n<li><b>lngFileID<\/b>: ID der Datei<\/li>\n<li><b>strFilename<\/b>: Name der Datei<\/li>\n<\/ul>\n<p>Allerdings ben&ouml;tigen wir hier logischerweise den Parameter <b>Expanded <\/b>nicht, da die Datei-Eintr&auml;ge keine weiteren untergeordneten Eintr&auml;ge enthalten.<\/p>\n<p>Die Prozedur <b>AddFileToDictionary<\/b> nutzt dieses Mal das <b>Dictionary<\/b>-Element aus der Variablen <b>dicFiles <\/b>und f&uuml;gt, sofern bisher nicht vorhanden, f&uuml;r jeden Wert aus <b>varParentID <\/b>ein neues Element hinzu. Diesem wird jeweils ein <b>Collection<\/b>-Objekt namens <b>col <\/b>hinzugef&uuml;gt, in dem alle Tupel aus <b>lngFileID <\/b>und <b>strFilename <\/b>landen.<\/p>\n<h2>TreeView-Steuerelement f&uuml;llen<\/h2>\n<p>Im letzten Schritt ruft die Prozedur <b>FillTreeView <\/b>eine weitere Prozedur namens <b>BuildTree <\/b>auf, die als ersten Parameter den Wert <b>Null <\/b>und als zweiten den Wert <b>Nothing <\/b>erh&auml;lt.<\/p>\n<p>Die Definition der Prozedur aus Listing 6 zeigt, wozu diese Parameterwerte verwendet werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BuildTree(varParentID<span style=\"color:blue;\"> As Variant<\/span>, objParentNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node)\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>varItem<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolExpanded<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span>dicFolders.Exists(Nz(varParentID, 0))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> col = dicFolders(Nz(varParentID, 0))\r\n         \r\n         For Each varItem In col\r\n             lngID = varItem(0)\r\n             strName = varItem(1)\r\n             bolExpanded = varItem(2)\r\n             \r\n             <span style=\"color:blue;\">If <\/span>objParentNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Set<\/span> objNode = objTreeview.Nodes.Add(, , \"f\" & lngID, strName, \"folder\")\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">Set<\/span> objNode = objTreeview.Nodes.Add(objParentNode.Key, tvwChild, \"f\" & lngID, strName, \"folder\")\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             objNode.Expanded = bolExpanded\r\n             \r\n             BuildTree lngID, objNode\r\n         <span style=\"color:blue;\">Next<\/span> varItem\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>dicFiles.Exists(Nz(varParentID, 0))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> col = dicFiles(Nz(varParentID, 0))\r\n         For Each varItem In col\r\n             lngID = varItem(0)\r\n             strName = varItem(1)\r\n             <span style=\"color:blue;\">If <\/span>objParentNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                 objTreeview.Nodes.Add , , \"i\" & lngID, name, \"book\"\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 objTreeview.Nodes.Add objParentNode.Key, tvwChild, \"i\" & lngID, strName, \"book\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> varItem\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: F&uuml;llen des TreeView-Steuerelements<\/span><\/b><\/p>\n<ul>\n<li><b>varParentID<\/b>: ID des &uuml;bergeordneten Elements aus der Tabelle <b>tblFolders <\/b>oder <b>tblFiles<\/b><\/li>\n<li><b>objParentNode<\/b>: <b>TreeView<\/b>&#8211;<b>Node<\/b>-Element, das f&uuml;r den Ordner mit der ID aus <b>varParentID <\/b>angelegt wurde.<\/li>\n<\/ul>\n<p>Die Prozedur <b>BuildTree <\/b>soll nun alle Daten aus den <b>Dictionary<\/b>&#8211; und den darin enthaltenen <b>Collection<\/b>-Elementen in das <b>TreeView<\/b>-Steuerelement schreiben.<\/p>\n<p>Dabei pr&uuml;fen wir als Erstes, ob sich im <b>Dictionary<\/b>-Element <b>dicFolders <\/b>ein Element mit dem Wert aus <b>varParentID <\/b>im Key befindet. Ist das der Fall, stellen wir die <b>Collection<\/b>-Variable <b>col <\/b>auf das Element aus <b>dicFolders <\/b>ein, das den Key aus <b>varParentID <\/b>enth&auml;lt.<\/p>\n<p>Im ersten Durchlauf hat <b>varParentID <\/b>den Wert <b>Null <\/b>und <b>objParentNode <\/b>hat den Wert <b>Nothing<\/b>, wir verarbeiten also zun&auml;chst alle Elemente der obersten Ebene.<\/p>\n<p>Danach durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Elemente der Collection, die sich im aktuellen <b>dicFolders<\/b>-Element befindet. Aus diesem lesen wir jeweils das aktuelle Element aus und referenzieren es mit der <b>Variant<\/b>-Variablen <b>varItem<\/b>.<\/p>\n<p>Wir erinnern uns: F&uuml;r jeden Folder haben wir in dem <b>Collection<\/b>-Element ein Array bestehend aus den drei Elementen ID, Name und Expanded eingef&uuml;gt.<\/p>\n<p>Diese lesen wir nun &uuml;ber die Indizes <b>0<\/b>, <b>1 <\/b>und <b>2 <\/b>aus und tragen sie in <b>lngID<\/b>, <b>strName <\/b>und <b>bolExpanded <\/b>ein.<\/p>\n<p>Wenn <b>objParentNode <\/b>den Wert <b>Nothing <\/b>enth&auml;lt, was beim ersten Durchlauf der Fall ist, werden alle Ordner-Elemente mit der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung des <b>TreeView<\/b>-Steuerelements in die erste Ebene eingetragen.<\/p>\n<p>Dabei geben wir f&uuml;r den Parameter <b>Key <\/b>eine Zeichenkette, bestehend aus dem Buchstaben <b>f <\/b>(f&uuml;r <b>Folder<\/b>) und der ID des Ordners an, f&uuml;r den Parameter <b>Text <\/b>den Namen des Ordners und f&uuml;r <b>Image <\/b>den Namen des anzuzeigenden Icons aus dem <b>ImageList<\/b>-Steuerelement.<\/p>\n<p>Es kann auch sein, dass die Prozedur <b>BuildTree <\/b>sich bereits selbst aufgerufen und dabei das aktuelle <b>Node<\/b>-Objekt und die ID des aktuellen Ordners als Parameter &uuml;bergeben hat.<\/p>\n<p>Dann w&uuml;rden wir den <b>Else<\/b>-Teil der ersten <b>If&#8230;Then<\/b>-Bedingung durchlaufen, wo die neu hinzuzuf&uuml;genden Elemente als Unterelemente des mit dem Parameter <b>objParentNode <\/b>&uuml;bergebenen Elements angelegt werden.<\/p>\n<p>Dazu geben wir die gleichen Parameterwerte wie f&uuml;r ein Element in der ersten Ebene an. Aber wir verwenden auch den Parameter <b>Relative<\/b>, den wir mit einer Zeichenkette aus dem Buchstaben <b>f <\/b>und der ID des Ordners und <b>Relationship<\/b>, dem wir den Wert <b>tvwChild <\/b>&uuml;bergeben, damit das neue Element als Kind-Element angelegt wird.<\/p>\n<p>Das neu hinzugef&uuml;gte Element referenzieren wir jeweils mit der Variablen <b>objNode<\/b>, damit wir dessen Eigenschaft <b>Expanded <\/b>auf den Wert aus <b>bolExpanded <\/b>einstellen k&ouml;nnen.<\/p>\n<p>Schlie&szlig;lich rufen wir die Funktion selbst erneut auf und &uuml;bergeben diesmal die ID des zuletzt hinzugef&uuml;gten Elements sowie das <b>Node<\/b>-Element, dem wir die weiteren Elemente unterordnen wollen.<\/p>\n<p>Wenn auf diese Weise alle Ordner durchgearbeitet wurden, k&uuml;mmern wir uns in der zweiten <b>If&#8230;Then<\/b>-Bedingung um die Dateien aus dem <b>Dictionary<\/b>-Objekt <b>dicFiles<\/b>.<\/p>\n<p>Auch hier pr&uuml;fen wir, ob f&uuml;r den Parameter <b>varParentID <\/b>&uuml;berhaupt ein Eintrag existiert und referenzieren diesen, falls vorhanden.<\/p>\n<p>Dann weisen wir der <b>Collection<\/b>-Variablen <b>col <\/b>die darin gespeicherte Collection zu. Auch diese enth&auml;lt f&uuml;r jede Datei ein Array, das wir mit <b>varItem <\/b>referenzieren und aus dem wir &uuml;ber den Index die Werte f&uuml;r die Variablen <b>lngID <\/b>und <b>strName <\/b>der aktuellen Datei auslesen. Danach folgt wieder die <b>If&#8230;Then<\/b>-Bedingung, die pr&uuml;ft, ob <b>objParentNode <\/b>den Wert <b>Nothing <\/b>enth&auml;lt, als ob es sich um ein Element der ersten Ebene handelt oder um ein untergeordnetes Element.<\/p>\n<p>Im Falle eines Elements der ersten Ebene werden die Eintr&auml;ge f&uuml;r die Dateien direkt unterhalb der Ordner der ersten Ebene angelegt &#8211; wieder mit der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung. Hier verwenden wir allerdings einen Key, der aus dem Buchstaben <b>i <\/b>und der ID der Datei besteht. Da wir das <b>f <\/b>bereits f&uuml;r die <b>Folder<\/b>-Elemente genutzt haben und <b>Files <\/b>auch mit <b>f <\/b>beginnt, haben wir hier einfach den zweiten Buchstaben genutzt, also <b>i<\/b>.<\/p>\n<p>Der <b>Else<\/b>-Zweig wird angesteuert, wenn mit <b>objParentNode <\/b>bereits ein &uuml;bergeordnetes Element &uuml;bergeben wurde, die Datei sich also in einem Ordner befindet und nicht in der ersten Ebene.<\/p>\n<p>Hier geben wir mit den ersten Parametern der <b>Add<\/b>-Methode wieder an, unter welchem <b>Folder<\/b>-Element das neue File-Element angelegt werden soll. Auf diese Weise durchlaufen wir alle Elemente der beiden Dictionaries und f&uuml;llen das <b>TreeView<\/b>-Steuerelement wie in Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_01\/pic_1584_005.png\" alt=\"Das gef&uuml;llte TreeView-Steuerelement\" width=\"499,6267\" height=\"425,0684\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das gef&uuml;llte TreeView-Steuerelement<\/span><\/b><\/p>\n<h2>Die Schaltfl&auml;che &#8222;Neu einlesen&#8220;<\/h2>\n<p>Es fehlt noch die Schaltfl&auml;che <b>cmdNeuEinlesen<\/b>, mit der wir nach der Auswahl eines anderen Ordners im Textfeld <b>txtBasisordner<\/b> das erneute Einlesen der Daten aus den Tabellen initialisieren wollen. Diese Schaltfl&auml;che l&ouml;st die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuEinlesen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"DELETE FROM tblFiles\", dbFailOnError\r\n     db.Execute \"DELETE FROM tblFolders\", dbFailOnError\r\n     <span style=\"color:blue;\">Call<\/span> OrdnerUndDateienEinlesen(Me.txtBasispfad)\r\n     <span style=\"color:blue;\">Call<\/span> Form_Load\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie l&ouml;scht alle Daten aus den beiden Tabellen, liest diese mit der Prozedur <b>OrdnerUndDateienEinlesen<\/b> erneut ein und ruft die Prozedur <b>Form_Load<\/b> auf, damit das TreeView erneut gef&uuml;llt wird &#8211; dieses Mal mit den neu eingelesenen Daten.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag zeigen wir, wie die Daten aus den beiden Tabellen <b>tblFolders<\/b> und <b>tblFiles <\/b>in einem TreeView-Steuerelement angezeigt werden k&ouml;nnen. <\/p>\n<p>In einem weiteren Beitrag namens <b>Mit Ordnern und Dateien im TreeView arbeiten <\/b>(<b>www.access-im-unternehmen.de\/1585<\/b>) liefern wir die Funktionen, mit denen wir im TreeView mit diesen Dateien arbeiten k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OrdnerUndDateienInAccessEinlesen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/0E09C4C3-C5AB-4938-958B-AF9A1A4E9201\/aiu_1584.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Artikel &#8222;Ordner und Dateien in Access-Tabellen einlesen&#8220; (www.access-im-unternehmen.de\/1583) haben wir gezeigt, wie wir den Inhalt kompletter Ordner samt Unterordnern und Dateien in Tabellen speichern. Doch was helfen die dort liegenden Daten, wenn wir sie nicht in einem Access-Formular anzeigen k&ouml;nnen? Wie das gelingt, zeigen wir im vorliegenden Artikel. Als Steuerelement f&uuml;r die Anzeige hierarchischer Daten ist das TreeView-Steuerelement pr&auml;destiniert. Wir m&ouml;chten alle Elemente der Tabellen aus dem oben genannten Artikel in einem solchen Steuerelement anzeigen und weitere Funktionen hinzuf&uuml;gen: die Anzeige des jeweiligen Ordners direkt im Windows Explorer, das &Ouml;ffnen der aktuell markierten Datei oder auch das Ausschneiden, Kopieren und Einf&uuml;gen, das wir nicht nur auf die Elemente des TreeView-Steuerelements anwenden, sondern auch auf die Originaldateien. Auch das Umbenennen von Ordnern und Dateien soll m&ouml;glich sein &#8211; und schlie&szlig;lich wollen wir auch noch deren Speicherort durch Drag and Drop anpassen k&ouml;nnen. In diesem Artikel erf&auml;hrst Du erst einmal, wie Du das TreeView schnell mit Ordnern und Dateien f&uuml;llen kannst. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012026,662026,44000026],"tags":[],"class_list":["post-55001584","post","type-post","status-publish","format-standard","hentry","category-66012026","category-662026","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dateien schnell im TreeView-Steuerelement anzeigen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dateien schnell im TreeView-Steuerelement anzeigen\" \/>\n<meta property=\"og:description\" content=\"Im Artikel &quot;Ordner und Dateien in Access-Tabellen einlesen&quot; (www.access-im-unternehmen.de\/1583) haben wir gezeigt, wie wir den Inhalt kompletter Ordner samt Unterordnern und Dateien in Tabellen speichern. Doch was helfen die dort liegenden Daten, wenn wir sie nicht in einem Access-Formular anzeigen k&ouml;nnen? Wie das gelingt, zeigen wir im vorliegenden Artikel. Als Steuerelement f&uuml;r die Anzeige hierarchischer Daten ist das TreeView-Steuerelement pr&auml;destiniert. Wir m&ouml;chten alle Elemente der Tabellen aus dem oben genannten Artikel in einem solchen Steuerelement anzeigen und weitere Funktionen hinzuf&uuml;gen: die Anzeige des jeweiligen Ordners direkt im Windows Explorer, das &Ouml;ffnen der aktuell markierten Datei oder auch das Ausschneiden, Kopieren und Einf&uuml;gen, das wir nicht nur auf die Elemente des TreeView-Steuerelements anwenden, sondern auch auf die Originaldateien. Auch das Umbenennen von Ordnern und Dateien soll m&ouml;glich sein - und schlie&szlig;lich wollen wir auch noch deren Speicherort durch Drag and Drop anpassen k&ouml;nnen. In diesem Artikel erf&auml;hrst Du erst einmal, wie Du das TreeView schnell mit Ordnern und Dateien f&uuml;llen kannst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-06T13:36:20+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dateien schnell im TreeView-Steuerelement anzeigen\",\"datePublished\":\"2026-02-06T13:36:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/\"},\"wordCount\":2864,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/81a27bab46ff42f48b36f3db305d7d7e\",\"articleSection\":[\"1\\\/2026\",\"2026\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/\",\"name\":\"Dateien schnell im TreeView-Steuerelement anzeigen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/81a27bab46ff42f48b36f3db305d7d7e\",\"datePublished\":\"2026-02-06T13:36:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/81a27bab46ff42f48b36f3db305d7d7e\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/81a27bab46ff42f48b36f3db305d7d7e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dateien schnell im TreeView-Steuerelement anzeigen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dateien schnell im TreeView-Steuerelement anzeigen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/","og_locale":"de_DE","og_type":"article","og_title":"Dateien schnell im TreeView-Steuerelement anzeigen","og_description":"Im Artikel \"Ordner und Dateien in Access-Tabellen einlesen\" (www.access-im-unternehmen.de\/1583) haben wir gezeigt, wie wir den Inhalt kompletter Ordner samt Unterordnern und Dateien in Tabellen speichern. Doch was helfen die dort liegenden Daten, wenn wir sie nicht in einem Access-Formular anzeigen k&ouml;nnen? Wie das gelingt, zeigen wir im vorliegenden Artikel. Als Steuerelement f&uuml;r die Anzeige hierarchischer Daten ist das TreeView-Steuerelement pr&auml;destiniert. Wir m&ouml;chten alle Elemente der Tabellen aus dem oben genannten Artikel in einem solchen Steuerelement anzeigen und weitere Funktionen hinzuf&uuml;gen: die Anzeige des jeweiligen Ordners direkt im Windows Explorer, das &Ouml;ffnen der aktuell markierten Datei oder auch das Ausschneiden, Kopieren und Einf&uuml;gen, das wir nicht nur auf die Elemente des TreeView-Steuerelements anwenden, sondern auch auf die Originaldateien. Auch das Umbenennen von Ordnern und Dateien soll m&ouml;glich sein - und schlie&szlig;lich wollen wir auch noch deren Speicherort durch Drag and Drop anpassen k&ouml;nnen. In diesem Artikel erf&auml;hrst Du erst einmal, wie Du das TreeView schnell mit Ordnern und Dateien f&uuml;llen kannst.","og_url":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-02-06T13:36:20+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dateien schnell im TreeView-Steuerelement anzeigen","datePublished":"2026-02-06T13:36:20+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/"},"wordCount":2864,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e","articleSection":["1\/2026","2026","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/","url":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/","name":"Dateien schnell im TreeView-Steuerelement anzeigen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e","datePublished":"2026-02-06T13:36:20+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/81a27bab46ff42f48b36f3db305d7d7e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Dateien_schnell_im_TreeViewSteuerelement_anzeigen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dateien schnell im TreeView-Steuerelement anzeigen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001584"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001584\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}