{"id":55000667,"date":"2009-06-01T00:00:00","date_gmt":"2020-05-22T22:23:35","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=667"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"TreeViewKonfigurator","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/","title":{"rendered":"TreeView-Konfigurator"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>&#8222;Ein TreeView f&uuml;llen &#8211; mit hierarchischen Daten Das ist doch wohl ein alter Hut!&#8220; Das stimmt wohl, denn genau daf&uuml;r ist dieses Steuerelement ja nun auch gemacht. Wir vereinfachen das F&uuml;llen des TreeViews aber ein wenig, indem wir eine Methode bereitstellen, bei der Sie nur noch die Namen der betroffenen Tabelle in eine weitere Tabelle schreiben und die beim Klicken auf die Elemente des TreeViews durchzuf&uuml;hrenden Aktionen festlegen m&uuml;ssen.<\/b><\/p>\n<p>Haben Sie schon mal ein TreeView programmiert, das zumindest die &uuml;blichen Funktionen wie das Hinzuf&uuml;gen untergeordneter Elemente, das L&ouml;schen des aktuellen Knotens, das Auf- und Zuklappen von Zweigen, sowie das automatische Speichern des Zustands des TreeViews implementiert<\/p>\n<p>Und welches zus&auml;tzlich, um die Performance zu verbessern, nur jeweils die sichtbaren Elemente plus der folgenden Ebene anlegt, damit nicht alle Elemente gleich zu Beginn geladen werden m&uuml;ssen und dies somit m&ouml;glicherweise zu Verz&ouml;gerungen f&uuml;hrt<\/p>\n<p>Nun, dann wissen Sie, wie viel Arbeit so etwas verursachen kann &#8211; egal, ob Sie die Daten aus den Tabellen eines hierarchisch aufgebauten Datenmodells beziehen oder aus einer Tabelle, die reflexiv mit sich selbst verkn&uuml;pft ist.<\/p>\n<p>Wenn Sie sich mit ein paar Randbedingungen abfinden und die nachfolgend vorgestellten Standardfunktionen f&uuml;r Ihren Anwendungsfall ausreichen, k&ouml;nnen Sie die L&ouml;sung dieses Beitrags gleich einsetzen. Wenn nicht, m&uuml;ssen Sie entweder selbst noch Funktionen hinzuf&uuml;gen oder uns die fehlenden Funktionen mitteilen &#8211; wir werden uns nicht scheuen, sinnvolle Erweiterungen f&uuml;r Sie zu entwickeln und in einer sp&auml;teren Ausgabe von <b>Access im Unternehmen <\/b>zu ver&ouml;ffentlichen.<\/p>\n<p>Bild 1 zeigt ein Beispiel f&uuml;r ein mit dem hier vorgestellten Tool gesteuerten TreeView-Steuerelement. Sie k&ouml;nnen damit sowohl die Daten aus hierarchisch angeordneten Tabellen als auch von Daten aus reflexiven Beziehungen darstellen &#8211; auch gemischt. In den folgenden Abschnitten erfahren Sie, wie dies funktioniert und welche Voraussetzungen n&ouml;tig sind.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: TreeView mit hierarchischen und reflexiven Tabellen<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Voraussetzungen des Datenmodells<\/p>\n<p>Die Voraussetzungen beziehen sich in erster Linie auf den Aufbau der Tabellen, deren Daten im TreeView angezeigt werden sollen. Diese sehen so aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Jede Tabelle muss einen aus einem einzigen Feld bestehenden Prim&auml;rschl&uuml;ssel mit dem Datentyp <b>Long<\/b> besitzen.<\/li>\n<li class=\"aufz-hlung\">Jede Tabelle, die einer Tabelle untergeordnet ist, muss ein Fremdschl&uuml;sselfeld zur Herstellung der Verkn&uuml;pfung mit der &uuml;bergeordneten Tabelle besitzen (nur die Tabelle mit den Elementen der obersten Ebene braucht kein Fremdschl&uuml;sselfeld).<\/li>\n<li class=\"aufz-hlung\">Wenn eine Tabelle mit sich selbst verkn&uuml;pft ist, muss sie ein zus&auml;tzliches Fremdschl&uuml;sselfeld besitzen, das den Wert des Prim&auml;rschl&uuml;sselfelds des &uuml;bergeordneten Datensatzes enth&auml;lt.<\/li>\n<li class=\"aufz-hlung\">Wenn eine Tabelle mit sich selbst verkn&uuml;pft ist und das Root-Element, also das oberste Element, mit einem Element aus einer anderen Tabelle verkn&uuml;pft werden soll, muss es nat&uuml;rlich noch ein weiteres Fremdschl&uuml;sselfeld zur Verkn&uuml;pfung mit dieser anderen Tabelle aufweisen &#8211; neben dem Fremdschl&uuml;sselfeld f&uuml;r die Herstellung der reflexiven Beziehung. Es darf dann nur eines der beiden Fremdschl&uuml;sselfelder gef&uuml;llt sein.<\/li>\n<li class=\"aufz-hlung\">Jede Tabelle muss ein Feld mit dem anzuzeigenden Text enthalten.<\/li>\n<li class=\"aufz-hlung\">Jede Tabelle muss ein <b>Ja\/Nein<\/b>-Feld zum Speichern der <b>Expanded<\/b>-Eigenschaft des entsprechenden Elements besitzen. Dieses legt fest, ob eventuell untergeordnete Elemente direkt beim &Ouml;ffnen des TreeViews ausgeklappt werden.<\/li>\n<li class=\"aufz-hlung\">Jede Tabelle muss ein Feld zum Speichern des Namens einer Bilddatei enthalten, das in Zusammenhang mit dem jeweiligen Element angezeigt werden soll. Auch wenn dieses Feld nicht mit Daten gef&uuml;llt werden muss, so sollte es doch vorhanden sein. Die Bilddateien werden in einer speziellen Tabelle gespeichert &#8211; dazu sp&auml;ter mehr.<\/li>\n<\/ul>\n<p><b>Abfragen statt Tabellen<\/b><\/p>\n<p>Die geforderten Informationen k&ouml;nnen auch in Form einer Abfrage bereitgestellt werden. Dies macht beispielsweise Sinn, wenn Personennamen im TreeView angezeigt werden sollen und diese Namen nicht in einem einzelnen Feld, sondern in Feldern wie <b>Vorname<\/b> und <b>Nachname <\/b>liegen. Sie k&ouml;nnen dann eine Abfrage definieren, die diese Felder zu einem Feld zusammenfasst, das dann als Herkunft f&uuml;r die anzuzeigenden Felder dient.<\/p>\n<p>Auch kann es sein, dass eine reflexive Beziehung nicht direkt &uuml;ber ein in der Tabelle befindliches Fremdschl&uuml;sselfeld hergestellt wird, sondern &uuml;ber eine Verkn&uuml;pfungstabelle, welche neben einem Prim&auml;rschl&uuml;sselfeld zwei Fremdschl&uuml;sselfelder f&uuml;r die Aufnahme der beiden Prim&auml;rschl&uuml;sselwerte der beteiligten Datens&auml;tze aufnehmen soll. Auch hier m&uuml;ssen Sie eine Abfrage so erstellen, dass diese die eigentlichen Daten der Tabelle enth&auml;lt und auch die Verkn&uuml;pfungstabelle aufnimmt. Ein Beispiel finden Sie weiter unten.<\/p>\n<p><b>Notwendige Elemente<\/b><\/p>\n<p>Die hier vorgestellte L&ouml;sung ist kein externes Tool, das Ihnen den Code f&uuml;r das TreeView-Steuerelement zusammenbaut, sondern es liefert selbst den Code. Es erstellt also kein TreeView, sondern es steuert seine Erstellung und auch das TreeView und seine Elemente selbst. Aus der Beispieldatenbank zu diesem Beitrag m&uuml;ssen Sie die folgenden Elemente in die Zieldatenbank importieren:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Tabelle <b>tblContextMenuItems<\/b><\/li>\n<li class=\"aufz-hlung\">Tabelle <b>tblImages<\/b><\/li>\n<li class=\"aufz-hlung\">Tabelle <b>tblTreeViewConf<\/b><\/li>\n<li class=\"aufz-hlung\">Tabelle <b>tblTreeViews<\/b><\/li>\n<li class=\"aufz-hlung\">Abfrage <b>qryImages<\/b><\/li>\n<li class=\"aufz-hlung\">Formular <b>frmTreeViewConf<\/b><\/li>\n<li class=\"aufz-hlung\">Formular <b>sfmContextmenuItems<\/b><\/li>\n<li class=\"aufz-hlung\">Formular <b>sfmTreeViewConf<\/b><\/li>\n<li class=\"aufz-hlung\">Modul <b>mdlDatabase<\/b><\/li>\n<li class=\"aufz-hlung\">Modul <b>mdlErrorHandlung<\/b><\/li>\n<li class=\"aufz-hlung\">Modul <b>OGL2007<\/b><\/li>\n<li class=\"aufz-hlung\">Modul <b>mdlOLE<\/b><\/li>\n<li class=\"aufz-hlung\">Klassenmodul <b>clsCommandBarButton<\/b><\/li>\n<li class=\"aufz-hlung\">Klassenmodul <b>clsCommandBarButtonCollection<\/b><\/li>\n<li class=\"aufz-hlung\">Klassenmodul <b>clsTreeView<\/b><\/li>\n<\/ul>\n<p><b>Notwendige Verweise<\/b><\/p>\n<p>Au&szlig;erdem brauchen Sie einen Verweis auf die <b>Microsoft Office x.0 Object Library<\/b> sowie <b>OLE Automation<\/b>, die Sie im <b>Verweise<\/b>-Dialog (<b>Extras|Verweise<\/b>) des VBA-Editors einstellen.<\/p>\n<p><b>Grundger&uuml;st<\/b><\/p>\n<p>Das Grundger&uuml;st unserer L&ouml;sung besteht aus einem Formular mit den folgenden Steuerelementen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Microsoft TreeView Control 6.0<\/b><\/li>\n<li class=\"aufz-hlung\"><b>Microsoft ImageList Control 6.0<\/b><\/li>\n<\/ul>\n<p>Hinzu kommt, soweit gew&uuml;nscht, ein Unterformularsteuerelement zur Anzeige der Unterformulare mit den Detaildaten zum jeweils im TreeView-Steuerelement ausgew&auml;hlten Element. Wenn Sie die oben genannten Steuerelemente zu einem neuen Formular namens <b>frmProjekte<\/b> hinzugef&uuml;gt haben, k&ouml;nnen Sie das Projekt erstmalig kompilieren, was im Erfolgsfall hei&szlig;t, dass alle Komponenten und Verweise vorliegen.<\/p>\n<p><b>Steuerelemente benennen<\/b><\/p>\n<p>Da das ImageList-Steuerelement und das TreeView-Steuerelement sp&auml;ter vom Code aus referenziert werden sollen, vergeben Sie nun aussagekr&auml;ftige Namen f&uuml;r diese Elemente, am besten die folgenden:<\/p>\n<ul>\n<li class=\"aufz-hlung\">TreeView-Steuerelement: <b>ctlTreeView<\/b><\/li>\n<li class=\"aufz-hlung\">ImageList-Steuerelement: <b>ctlImageList<\/b><\/li>\n<\/ul>\n<p><b>TreeView konfigurieren<\/b><\/p>\n<p>Wir k&uuml;mmern uns zun&auml;chst nur um das Anlegen der n&ouml;tigen Tabellen und um das F&uuml;llen des TreeView-Steuerelements. Zuallererst ben&ouml;tigen wir eine Tabelle, welche die Daten f&uuml;r die Elemente der ersten Ebene liefert.<\/p>\n<p>Diese Tabelle nennen wir <b>tblProjekte <\/b>und f&uuml;llen sie mit den Feldern aus Bild 2. Dies sind die mindestens notwendigen Felder f&uuml;r die Integration der Daten einer Tabelle in das TreeView &#8211; zumindest unter Verwendung unserer L&ouml;sung. Legen Sie dann zu Beispielzwecken einige Datens&auml;tze wie in Bild 3 an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die Tabelle mit den Elementen der obersten Ebene in der Entwurfsansicht &#8230;<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: &#8230; und in der Datenblattansicht mit einigen Eintr&auml;gen.<\/span><\/b><\/p>\n<p><b>TreeViewHandler aufrufen<\/b><\/p>\n<p>Damit das Formular beim &Ouml;ffnen mit den gew&uuml;nschten Daten gef&uuml;llt wird, m&uuml;ssen Sie daf&uuml;r sorgen, dass es eine spezielle Klasse namens <b>clsTreeViewHandler <\/b>instanziert und dieser einige Informationen zuweist. Dies ist nicht besonders aufwendig und kann in der Ereignisprozedur <b>Form_Load <\/b>geschehen. Theoretisch ginge auch <b>Form_Open<\/b>, hier kann es jedoch zu Problemen kommen, weil die ActiveX-Steuerelemente m&ouml;glicherweise noch nicht initialisiert sind.<\/p>\n<p>F&uuml;r den Verweis auf die Klasse <b>clsTreeViewHandler <\/b>legen Sie folgende modulweit g&uuml;ltige Variable im Klassenmodul des Formulars fest:<\/p>\n<pre>Private WithEvents objTreeViewHandler As &micro;\r\nclsTreeViewHandler<\/pre>\n<p>Diese instanzieren Sie gleich in der ersten Zeile der Ereignisprozedur <b>Form_Load<\/b>. Anschlie&szlig;end weisen Sie dem neu erzeugten Objekt Verweise auf das <b>TreeView<\/b>-Steuerelement und das <b>ImageList<\/b>-Steuerelement zu und rufen die beiden Methoden <b>InitTreeView <\/b>und <b>FillTree <\/b>auf:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objTreeViewHandler = New clsTreeViewHandler\r\n    With objTreeViewHandler\r\n    Set .TreeViewInst = Me.ctlTreeView.Object\r\n    Set .ImageListInst = Me.ctlImageList.Object\r\n    .InitTreeView (1)\r\n    .FillTree\r\n    End With\r\n    End Sub<\/pre>\n<p><b>InitTreeView <\/b>erwartet noch einen Parameter, zu diesem kommen wir gleich. Erstmal m&uuml;ssen wir noch festlegen, welche Daten &uuml;berhaupt im TreeView angezeigt werden sollen &#8211; wir sind noch nicht so weit, dass sich der TreeViewHandler die ben&ouml;tigten Tabellen selbst zusammensucht.<\/p>\n<p>Dazu &ouml;ffnen Sie das Formular <b>frmTreeViewConf<\/b>, das erst einmal eine <b>InputBox <\/b>zur Eingabe des Namens eines TreeViews voranschickt (siehe Bild 4). Die Eingabe speichert der TreeView-Konfigurator in der Tabelle <b>tblTreeViews<\/b>. Der Hintergrund ist, dass eine Datenbank durchaus mehr als ein TreeView-Steuerelement enthalten kann (genau genommen kann sogar ein einziges Formular mehr als ein TreeView-Steuerelement anzeigen) und der TreeView-Konfigurator diese auch verwalten k&ouml;nnen soll.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Abfrage der Bezeichnung des TreeViews<\/span><\/b><\/p>\n<p>Dann folgt der gro&szlig;e Moment: Der TreeView-Konfigurator erscheint und erschl&auml;gt Sie vermutlich erstmal durch seine vielen Elemente (siehe Bild 5). Das TreeView-Steuerelement <b>Projektbaum <\/b>ist im oberen Kombinationsfeld bereits ausgew&auml;hlt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Der TreeView-Konfigurator<\/span><\/b><\/p>\n<p>Der obere Teil zeigt eine &Uuml;bersicht aller im TreeView anzuzeigenden Tabellen an. Dort w&auml;hlen Sie eine Tabelle aus und erhalten im Bereich darunter alle Details dieser Tabelle, die Sie dort auch direkt bearbeiten k&ouml;nnen. Au&szlig;erdem finden Sie dort Steuerelemente zum Anlegen einer neuen Tabelle, zum L&ouml;schen der aktuell angezeigten Tabelle, sowie zum Speichern.<\/p>\n<p>Der untere Bereich zeigt ebenfalls eine Liste an, die Sie allerdings direkt bearbeiten k&ouml;nnen. Dort tragen Sie alle Kontextmen&uuml;eintr&auml;ge ein, die in Zusammenhang mit den Elementen der aktuellen Tabelle im TreeView erscheinen sollen, wenn der Benutzer mit der rechten Maustaste darauf klickt. Wie Sie Code anlegen, um auf diese Mausklicks zu reagieren, erfahren Sie sp&auml;ter.<\/p>\n<p>Nun tragen Sie die bereits angelegte Tabelle <b>tblProjekte <\/b>in den TreeView-Konfigurator ein. Die Daten dieser Tabelle sehen nun etwa so wie in Bild 6 aus. Im Einzelnen bedeuten diese Eintr&auml;ge Folgendes:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Die Werte f&uuml;r die erste Tabelle im TreeView-Konfigurator<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ThisTable<\/b>: Name der Tabelle, welche die Daten f&uuml;r die Elemente dieser Ebene liefert<\/li>\n<li class=\"aufz-hlung\"><b>KeyChar<\/b>: Jedes TreeView-Element erh&auml;lt als eindeutige Kennung einen Key, der aus einem Buchstaben und dem Wert des Prim&auml;rschl&uuml;sselfelds des entsprechenden Datensatzes besteht. Der hier festgelegte <b>KeyChar <\/b>muss innerhalb des TreeViews eindeutig sein, da &uuml;ber ihn die Tabelle identifiziert wird, aus der ein Element stammt.<\/li>\n<li class=\"aufz-hlung\"><b>PKIDField<\/b>: Name des Prim&auml;rschl&uuml;sselfeldes der Tabelle dieser Ebene<\/li>\n<li class=\"aufz-hlung\"><b>NodetextField<\/b>: Name des Feldes, das den im TreeView-Element anzuzeigenden Text enth&auml;lt<\/li>\n<li class=\"aufz-hlung\"><b>NodeImageField<\/b>: Name des Feldes, das die Bezeichnung des Bilds aus dem ImageList-Steuerelement enth&auml;lt, das f&uuml;r die Elemente dieser Tabelle standardm&auml;&szlig;ig angezeigt werden soll<\/li>\n<li class=\"aufz-hlung\"><b>NodeExpandedField<\/b>: Name des <b>Ja\/Nein<\/b>-Feldes, das den <b>Expanded\/Collapsed<\/b>-Zustand des vom Element des aktuellen Datensatzes ausgehenden Zweigs festlegt<\/li>\n<\/ul>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Der erste Test<\/p>\n<p>Vor dem ersten Test ist noch eine Anpassung im Code n&ouml;tig: Wir haben der Methode <b>InitTreeView <\/b>in der Ereignisprozedur <b>Form_Load <\/b>zun&auml;chst den Wert <b>1 <\/b>als Parameter mitgegeben.<\/p>\n<p><!--30percent--><\/p>\n<p>Dort muss aber die ID der soeben im TreeView-Konfigurator angelegten TreeViews-Konfiguration stehen, die Sie dem Textfeld aus Bild 7 entnehmen k&ouml;nnen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic017_opt.jpeg\" alt=\"pic017.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Der TreeView-Konfigurator zeigt die ID des aktuell ausgew&auml;hlten TreeViews an.<\/span><\/b><\/p>\n<p>Das Ergebnis ist ern&uuml;chternd: Die beiden Eintr&auml;ge der ersten angelegten Tabelle sehen ein wenig aus wie bestellt und nicht abgeholt &#8211; dies bekommt man fast auch mit einem einfachen Listenfeld hin (siehe Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic007_opt.jpeg\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Das TreeView-Steuerelement mit der ersten Beispieltabelle<\/span><\/b><\/p>\n<p>Erstmal fehlt hier ein schickes Icon und zweitens w&auml;ren Plus-Zeichen zum Aufklappen untergeordneter Elemente nicht schlecht (und entsprechende Minus-Zeichen zum Minimieren).<\/p>\n<p>Okay: Um die Icons haben wir uns noch gar nicht gek&uuml;mmert und um Plus-Zeichen zum Ein- und Ausklappen von untergeordneten Elementen braucht man erstens erst einmal untergeordnete Elemente.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zweite Tabelle hinzuf&uuml;gen<\/p>\n<p>F&uuml;gen wir also eine weitere Tabelle zum TreeView-Konfigurator hinzu. Diese soll <b>tblMeilensteine <\/b>hei&szlig;en und enth&auml;lt gegen&uuml;ber der Tabelle <b>tblProjekte <\/b>noch ein weiteres Feld zum Herstellen der Beziehung mit dieser Tabelle. Im Beziehungsfenster der Datenbank sieht dies wie in Bild 9 aus. Die Tabelle tragen Sie nun ebenfalls in den TreeView-Konfigurator ein, und zwar mit den folgenden Werten:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic008_opt.jpeg\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Die Tabelle tblMeilensteine und ihre Verkn&uuml;pfung mit der Tabelle tblProjekte<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ThisTable<\/b>: <b>tblMeilensteine<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ParentTable<\/b>: <b>tblProjekte<\/b><\/li>\n<li class=\"aufz-hlung\"><b>KeyChar<\/b>: <b>m<\/b><\/li>\n<li class=\"aufz-hlung\"><b>PKIDField<\/b>: <b>ID<\/b><\/li>\n<li class=\"aufz-hlung\"><b>FKIDField<\/b>: <b>ProjektID<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodetextField<\/b>: <b>Meilenstein<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodeImageField<\/b>: <b>Image<\/b><\/li>\n<li class=\"aufz-hlung\"><b>NodeExpandedField<\/b>: <b>Expanded<\/b><\/li>\n<\/ul>\n<p>Das Ergebnis kann sich schon eher sehen lassen (siehe Bild 10). Es erscheinen zumindest einige untergeordnete Elemente (die Sie allerdings zuvor noch anlegen m&uuml;ssen).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic009_opt.jpeg\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Schon besser: Unterelemente zum Ein- und Ausklappen<\/span><\/b><\/p>\n<p><b>Sonderf&auml;lle f&uuml;r untergeordnete Tabellen<\/b><\/p>\n<p>Auch das System f&uuml;r das Hinzuf&uuml;gen weiterer Tabellen sollte nun klar sein. Es gibt eigentlich nur noch zwei Sonderf&auml;lle, die wichtig sind:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie k&ouml;nnen auch zwei oder mehr Tabellen unter einer bestehenden Tabelle anordnen. Sie m&uuml;ssen dazu lediglich den gleichen Tabellennamen unter <b>ParentTable <\/b>eintragen.<\/li>\n<li class=\"aufz-hlung\">Der TreeView-Konfigurator verarbeitet auch Tabellen mit einer reflexiven Beziehung &#8211; mehr dazu in den folgenden Abschnitten.<\/li>\n<\/ul>\n<p><b>Behandlung reflexiver Beziehungen<\/b><\/p>\n<p>Wenn eine Tabelle mit sich selbst verkn&uuml;pft ist, tragen Sie diese einfach zweimal in den TreeView-Konfigurator ein. Der erste Eintrag dient dazu, die Eintr&auml;ge ganz normal unterhalb der Elemente einer &uuml;bergeordneten Tabelle einzusortieren. Der zweite stellt dann die Beziehung der Elemente dieser Tabelle untereinander her.<\/p>\n<p>Im Gegensatz zur &uuml;blichen Notation von Tabellen im TreeView-Konfigurator tragen Sie als <b>ParentTable <\/b>die gleiche Tabelle nochmal ein, die Sie bereits als <b>ThisTable <\/b>eingetragen haben, und als <b>FKIDField <\/b>geben Sie das Fremdschl&uuml;sselfeld an, das den Wert des Prim&auml;rschl&uuml;sselfeldes des Datensatzes in der gleichen Tabelle enth&auml;lt, dem der aktuelle Datensatz untergeordnet werden soll.<\/p>\n<p>Das Ergebnis sollte etwa so aussehen wie in Bild 11. Dort wurden einige Aufgaben-Elemente untereinander angeordnet. Die Tabelle <b>tblAufgaben<\/b> muss dazu freilich ein weiteres Fremdschl&uuml;sselfeld erhalten, sodass diese nun wie in Bild 12 aussieht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic011_opt.jpeg\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: TreeView mit reflexiv verkn&uuml;pften Elementen<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic010_opt.jpeg\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Die Tabelle tblAufgaben besitzt mit KundenstoryID und ParentaufgabeID zwei Fremdschl&uuml;sselfelder.<\/span><\/b><\/p>\n<p><b>Was f&uuml;rs Auge<\/b><\/p>\n<p>Weiter oben haben wir das Fehlen von Icons bem&auml;ngelt. Auch hier nimmt der TreeView-Konfigurator Ihnen einige Arbeit ab. Im harten Entwickleralltag m&uuml;ssten Sie zun&auml;chst alle ben&ouml;tigten Bilder in das daf&uuml;r vorgesehene <b>ImageList<\/b>-Steuerelement laden und den TreeView-Elementen dann beim Anlegen die Bezeichnung der Bilder mit auf den Weg geben. Der Weg des TreeView-Konfigurators sieht ganz anders aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Bilddateien werden im OLE-Feld <b>Image <\/b>der Tabelle <b>tblImages <\/b>gespeichert, und zwar im Originalformat der Bilddatei. Das zweite Feld dieser Tabelle soll den Dateinamen enthalten, also beispielsweise <b>application.png<\/b>.<\/li>\n<li class=\"aufz-hlung\">Die Klasse <b>clsTreeViewHandler <\/b>sorgt beim Initialisieren daf&uuml;r, dass alle Bilder aus der Tabelle ausgelesen und in das <b>ImageList<\/b>-Steuerelement geschrieben werden.<\/li>\n<\/ul>\n<p>Dabei gibt es eine Besonderheit: Normalerweise sollten alle Elemente einer Tabelle auch das gleiche Bild anzeigen. M&ouml;glicherweise wollen Sie aber &uuml;ber das Bild verschiedene Status verschiedener Elemente aus der gleichen Tabelle darstellen &#8211; beispielsweise um erledigte Aufgaben mit einem H&auml;kchen zu versehen.<\/p>\n<p>Daher enth&auml;lt auch jede Tabelle ein Feld namens <b>Image<\/b>, das f&uuml;r jeden Datensatz eine individuelle Bildbezeichnung aufnimmt. Beim F&uuml;llen des TreeView-Steuerelements pr&uuml;ft der TreeView-Konfigurator dann, ob der einzelne Datensatz ein individuelles Bild erfordert, und zeigt dieses gegebenenfalls an.<\/p>\n<p>Ist keines angegeben, wird das allgemein f&uuml;r Datens&auml;tze dieser Tabelle vorgemerkte Bild verwendet. Schlie&szlig;lich kann, wie es beim aktuellen Zustand unseres Beispiels der Fall ist, auch gar kein Bild angegeben worden sein &#8211; in diesem Fall wird eben &uuml;berhaupt kein Bild angezeigt.<\/p>\n<p>Wie aber gelangen die Bilder &uuml;berhaupt in die Tabelle <b>tblImages<\/b> Dazu verwenden Sie eine Routine namens <b>SaveFileToOLEField<\/b>. Der folgende Aufruf etwa speichert eine im aktuellen Verzeichnis befindliche Datei namens <b>application.png <\/b>im Feld <b>ImageObject <\/b>der Tabelle <b>tblImages<\/b>:<\/p>\n<pre>SaveFileOoOLEField CurrentProject.Path &amp; \"\\application.png\", \"tblImages\", \"ImageObject\", False<\/pre>\n<p>Anschlie&szlig;end m&uuml;ssen Sie f&uuml;r den neuen Datensatz noch das Feld <b>ImageName <\/b>f&uuml;llen, und zwar mit <b>application.png<\/b>. Die Datei liegt nun in einem Format in diesem Feld vor, das der TreeView-Konfigurator in das <b>ImageList<\/b>-Steuerelement einlesen kann.<\/p>\n<p>Die Tabelle <b>tblImages <\/b>der Beispieldatenbank enth&auml;lt einige Beispielbilder, die Sie den einzelnen Tabellen beziehungsweise Datens&auml;tzen wie folgt zuweisen k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>tblProjekte <\/b>&#8211; <b>application.png<\/b><\/li>\n<li class=\"aufz-hlung\"><b>tblMeilensteine <\/b>&#8211; <b>flag_checkered.png<\/b><\/li>\n<li class=\"aufz-hlung\"><b>tblIterationen <\/b>&#8211; <b>breakpoint.png<\/b><\/li>\n<li class=\"aufz-hlung\"><b>tblKundenstories <\/b>&#8211; <b>book_blue.png<\/b><\/li>\n<li class=\"aufz-hlung\"><b>tblAufgaben <\/b>&#8211; <b>note.png<\/b><\/li>\n<\/ul>\n<p>Da die Tabelle <b>tblAufgaben <\/b>im TreeView-Konfigurator zweimal enthalten ist, m&uuml;ssen Sie auch beiden Exemplaren das entsprechende Image zuweisen.<\/p>\n<p>Damit Sie erkennen, dass sich auch individuell in den Datens&auml;tzen der Tabellen eingetragene Bilder auswirken, f&uuml;gen Sie einem Datensatz der Tabelle <b>tblAufgaben <\/b>das Bild <b>note_ok.png <\/b>hinzu, das zus&auml;tzlich zum Bild <b>note.png <\/b>noch ein Erledigt-Symbol aufweist. Bild 13 zeigt das Ergebnis.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic012_opt.jpeg\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: TreeView mit Icons<\/span><\/b><\/p>\n<p><b>Ereignisse abfangen<\/b><\/p>\n<p>Nun haben Sie zwar ein sch&ouml;nes TreeView, aber was hilft das, wenn Sie noch nicht einmal den Mausklick auf eines der Elemente abfangen und mit entsprechendem Code darauf reagieren k&ouml;nnen &#8211; also so, wie Sie es vielleicht von vorherigen TreeView-Entwicklungen gewohnt sind<\/p>\n<p>Der TreeView-Konfigurator bietet eine vereinfachte Handhabung solcher Ereignisse. Das Ziel beim Schreiben von Code f&uuml;r den Mausklick auf ein Element des TreeView-Steuerelements ist normalerweise, seine Details in einem neben dem TreeView-Steuerelement angezeigten Unterformular anzuzeigen.<\/p>\n<p>Dies erfordert zun&auml;chst die Identifikation des betroffenen TreeView-Elements, und dann geht es erst richtig los: Sie m&uuml;ssen auf Basis dieser Information herausfinden, welcher Datensatz aus welcher Tabelle durch dieses Element abgebildet wird, und zeigen dann dessen Daten an.<\/p>\n<p>Der TreeView-Konfigurator nimmt Ihnen den gr&ouml;&szlig;ten Teil dieser Aufgabe ab. Dadurch, dass Sie mit der Eigenschaft <b>KeyChar <\/b>einen Buchstaben festgelegt haben, der f&uuml;r jede Tabelle eindeutig ist, und dadurch, dass die <b>Key<\/b>-Eigenschaft des aktuellen Elements nicht nur diesen Buchstaben, sondern auch noch den Wert des Prim&auml;rschl&uuml;sselfelds des betroffenen Datensatzes enth&auml;lt, kann das entsprechende Ereignis leicht die ben&ouml;tigten Informationen aufbereiten.<\/p>\n<p>Im Klassenmodul des Formulars k&ouml;nnen Sie nun, da Sie das <b>clsTreeViewHandler<\/b>-Element als <b>WithEvents <\/b>deklariert haben, auf dessen Ereignisse zur&uuml;ckgreifen. W&auml;hlen Sie einfach im linken Kombinationsfeld des Codefensters den Eintrag <b>objTreeViewHandler <\/b>und im rechten <b>NodeClick <\/b>aus (siehe Bild 14). Wenn Sie schon Erfahrung im Umgang mit der Programmierung des TreeView-Steuerelements haben, wird Ihnen auffallen, dass der nun erscheinende Prozedurkopf ganz anders aussieht als der des Click-Ereignisses herk&ouml;mmlicher TreeView-Steuerelemente:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic013_opt.jpeg\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Anlegen eines NodeClick-Ereignisses im VBA-Editor<\/span><\/b><\/p>\n<pre>Private Sub objTreeViewHandler_NodeClick(strTable As String, strPKID As String, lngPKID As Long)<\/pre>\n<p>Er liefert n&auml;mlich ganz andere Parameter, mit denen Sie im vorliegenden Fall viel mehr anfangen k&ouml;nnen als mit den sonst gelieferten. Die Parameter lauten:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strTable<\/b>: Name der Tabelle, aus der das angeklickte Element stammt<\/li>\n<li class=\"aufz-hlung\"><b>strPKID<\/b>: Name des Prim&auml;rschl&uuml;sselfelds dieser Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>lngPKID<\/b>: Wert des Prim&auml;rschl&uuml;sselfelds des Datensatzes, den das angeklickte Element repr&auml;sentiert<\/li>\n<\/ul>\n<p>Damit k&ouml;nnen Sie alles erledigen, was in Zusammenhang mit der Anzeige von Daten bezogen auf dieses Element n&ouml;tig ist: Zum Beispiel das Anzeigen eines Unterformulars mit dem ausgew&auml;hlten Datensatz als Datenherkunft.<\/p>\n<p>Auch f&uuml;r den Doppelklick gibt es ein entsprechendes Ereignis, das sich anbietet, um ein Popup-Formular mit den Daten des hinter dem jeweiligen Element stehenden Datensatzes zu &ouml;ffnen.<\/p>\n<p>Wie das genau funktioniert, zeigen wir im Beitrag <b>Softwareprojektverwaltung <\/b>(s. Shortlink 669). An dieser Stelle beschr&auml;nken wir uns auf die grundlegende Funktionsweise, bei der einfach nur ein Meldungsfenster mit den &uuml;bergebenen Informationen erscheint. Dazu best&uuml;cken Sie die Ereignisprozedur wie in Listing 1.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Anzeigen eines Meldungsfensters beim Anklicken eines TreeView-Elements<\/p>\n<pre>Private Sub objTreeViewHandler_NodeClick(strTable As String, strPKID As String, lngPKID As Long)\r\n    MsgBox \"Sie haben einen Eintrag aus der Tabelle &euro;&#154;\" &amp; strTable &amp; \"&euro; mit dem Wert &euro;&#154;\" _\r\n    &amp; lngPKID &amp; \"&euro; im Prim&auml;rschl&uuml;sselfeld &euro;&#154;\" &amp; strPKID &amp; \"&euro; angeklickt.\"\r\n    End Sub<\/pre>\n<p>Das Ergebnis sieht dann etwa so wie in Bild 15 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic014_opt.jpeg\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 15: Nach dem Klick auf ein Element im TreeView erscheint diese Meldung, die Sie nat&uuml;rlich auch durch beliebige andere Elemente wie etwa Detailformulare ersetzen k&ouml;nnen.<\/span><\/b><\/p>\n<p><b>Kontextmen&uuml;s<\/b><\/p>\n<p>Im TreeView sind Kontextmen&uuml;s ein wichtiges Instrument zum Durchf&uuml;hren von Aktionen wie L&ouml;schen des aktuellen Datensatzes oder Hinzuf&uuml;gen neuer Unterknoten. Vielleicht soll Ihr TreeView-Steuerelement auch Dateien repr&auml;sentieren, f&uuml;r die es Kontextmen&uuml;eintr&auml;ge zum &Ouml;ffnen oder Drucken bereitstellt &#8211; der Fantasie sind hier keine Grenzen gesetzt.<\/p>\n<p>Zun&auml;chst einmal m&uuml;ssen Sie daf&uuml;r sorgen, dass beim Rechtsklick auf die Elemente des TreeViews &uuml;berhaupt Kontextmen&uuml;eintr&auml;ge angezeigt werden. Dazu &ouml;ffnen Sie erneut den TreeView-Konfigurator, w&auml;hlen die Tabelle aus, f&uuml;r deren Eintr&auml;ge Sie Kontextmen&uuml;befehle festlegen m&ouml;chten, und widmen sich dann dem Unterformular ganz unten. Markieren Sie beispielsweise die Tabelle <b>tblProjekte <\/b>und legen Sie unten die beiden Eintr&auml;ge aus Bild 16 an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic015_opt.jpeg\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 16: Anlegen von Kontextmen&uuml;eintr&auml;gen<\/span><\/b><\/p>\n<p>Die Werte der ersten Spalte entsprechen dem im Kontextmen&uuml; angezeigten Text, die der zweiten enthaltenen Parameterwerte, die der weiter unten beschriebenen Ereignisprozedur beim Ausw&auml;hlen eines Kontextmen&uuml;eintrags &uuml;bergeben werden.<\/p>\n<p>Wenn Sie das Formular <b>frmProjekte <\/b>nun erneut &ouml;ffnen und mit der rechten Maustaste auf einen der Projekt-Eintr&auml;ge klicken, erscheint schon das Kontextmen&uuml; aus Bild 17.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/TreeView-web-images\/pic016_opt.jpeg\" alt=\"pic016.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 17: Das frisch angelegte Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen Sie nur noch entscheiden, was nach dem Klick auf einen der Kontextmen&uuml;eintr&auml;ge geschehen soll. Grundlage daf&uuml;r ist eine weitere Ereignisprozedur des Objekts <b>objTreeViewHandler <\/b>namens <b>ShortcutMenuClick<\/b>. Dieses sieht nach dem Anlegen wie folgt aus:<\/p>\n<pre>    Private Sub objTreeViewHandler_ShortcutMenuClick&micro;\r\n        (strParameter As String, strThisTable As String,&micro;\r\n        strPKID As String, lngPKIDValue As Long)<\/pre>\n<p>Sie sehen die gleichen Parameter, die Sie bereits vom <b>Click<\/b>-Ereignis her kennen, und ein zus&auml;tzliches Element namens <b>strParameter<\/b>. Dieser liefert genau den Wert, den Sie in der zweiten Spalte des Kontextmen&uuml;-Unterformulars im TreeView-Konfigurator angegeben haben.<\/p>\n<p>Aufgrund dieses Werts wissen Sie genau, welchen Kontextmen&uuml;eintrag der Benutzer angeklickt hat, und mit den drei &uuml;brigen Parametern liefert die Ereignisprozedur ausreichend Informationen, um das Element des TreeViews zu identifizieren, mit dem die gew&uuml;nschte Aktion durchgef&uuml;hrt werden soll.<\/p>\n<p><b>TreeView-Elemente l&ouml;schen<\/b><\/p>\n<p>Wie setzen Sie dies nun ein Wir schauen uns das am Beispiel eines L&ouml;schvorgangs an. Ein Projekt soll also gel&ouml;scht werden. Die Ereignisprozedur liefert dazu beispielsweise die folgenden Informationen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strParameter<\/b>: <b>DeleteProject<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strThisTable<\/b>: <b>tblProjekte<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strPKID<\/b>: <b>ID<\/b><\/li>\n<li class=\"aufz-hlung\"><b>lngPKIDValue<\/b>: <b>1<\/b><\/li>\n<\/ul>\n<p>Diese werten Sie in der Ereignisroutine wie in Listing 2 aus.<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Auswerten einer Kontextmen&uuml;-Aktion<\/p>\n<pre>Private Sub objTreeViewHandler_ShortcutMenuClick(strParameter As String, strThisTable As String, _\r\n    strPKID As String, lngPKIDValue As Long)\r\n    Select Case strParameter\r\n    Case \"DeleteProject\"\r\n    If MsgBox(\"M&ouml;chten Sie das Projekt wirklich l&ouml;schen\", vbYesNo + vbExclamation, _\r\n    \"L&ouml;schvorgang\") = vbYes Then\r\n    dbs.Execute \"DELETE FROM \" &amp; strThisTable &amp; \" WHERE \" &amp; strPKID &amp; \" = \" _\r\n    &amp; lngPKIDValue, dbFailOnError\r\nEnd If\r\nEnd Select\r\nEnd Sub<\/pre>\n<p>Dies l&ouml;scht recht zuverl&auml;ssig den ausgew&auml;hlten Datensatz. Wie aber wird das TreeView-Steuerelement aktualisiert, also das entsprechende Element entfernt<\/p>\n<p>Beim n&auml;chsten &Ouml;ffnen geschieht das zwar automatisch, weil der Datensatz nicht mehr vorhanden ist, aber das Element soll ja direkt nach dem L&ouml;schen nicht mehr zu sehen sein.<\/p>\n<p>Dazu k&ouml;nnen Sie eine der Methoden des TreeViewHandlers verwenden. Die f&uuml;r diesen Fall geeignete hei&szlig;t schlicht <b>DeleteCurrentNode<\/b> und wird so aufgerufen:<\/p>\n<pre>        objTreeViewHandler.DeleteCurrentNode<\/pre>\n<p>Parameter sind nicht n&ouml;tig, weil das betroffene Element ja durch den Aufruf des Kontextmen&uuml;s ausgew&auml;hlt wurde und die Methode das aktuell ausgew&auml;hlte Element aus dem TreeView entfernt.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">TreeView-Elemente hinzuf&uuml;gen<\/p>\n<p>Wer Elemente entfernen m&ouml;chte, muss zun&auml;chst einmal welche hinzuf&uuml;gen. Wenn man dies ausschlie&szlig;lich &uuml;ber Kontextmen&uuml;eintr&auml;ge erledigen m&ouml;chte, f&auml;llt direkt beim Versuch, ein Projekt anzulegen, eine Schwachstelle des Aufbaus unseres TreeViews auf: Es gibt kein Element, das den Projekt-Elementen &uuml;bergeordnet ist, und somit gibt es auch keine wirklich geeignete Stelle, um einen <b>Neues Projekt<\/b>-Kontextmen&uuml;eintrag anzulegen.<\/p>\n<p>Wir tricksen an dieser Stelle ein wenig und f&uuml;hren eine neue Tabelle namens <b>tblRoot <\/b>ein, die nur die Felder <b>ID<\/b>, <b>Root<\/b>, <b>Image <\/b>und <b>Expanded <\/b>enth&auml;lt und mit einem Datensatz gef&uuml;llt ist, der in der Reihenfolge der zuvor genannten Felder diese Werte enth&auml;lt: <b>1<\/b>, <b>Projekte<\/b>, <b>application.png<\/b>, <b>true<\/b>.<\/p>\n<p>F&uuml;gen Sie diese Tabelle zum TreeView-Konfigurator hinzu, wie Sie es zuvor mit der Tabelle <b>tblProjekte <\/b>gemacht haben. Die Tabelle <b>tblProjekte <\/b>hingegen soll nun dieser Root-Tabelle untergeordnet werden.<\/p>\n<p>Dazu braucht sie zun&auml;chst ein Fremdschl&uuml;sselfeld namens <b>RootID<\/b>. Damit der TreeView-Konfigurator erkennt, dass die Tabelle <b>tblProjekte <\/b>der Tabelle <b>tblRoot <\/b>untergeordnet ist, m&uuml;ssen Sie dem Datensatz f&uuml;r die Tabelle <b>tblProjekte <\/b>noch den Wert <b>tblRoot <\/b>f&uuml;r Parenttabelle und <b>RootID <\/b>f&uuml;r <b>FKID <\/b>hinzuf&uuml;gen.<\/p>\n<p>Wenn Sie nun das Formular <b>frmProjekte <\/b>&ouml;ffnen, befindet sich vor dem Element mit der Bezeichnung <b>Projekte <\/b>allerdings noch ein Plus-Zeichen zum Ein- und Ausklappen aller Projekte. Wenn dieses nicht angezeigt werden soll, m&uuml;ssen Sie in der <b>Form_Open<\/b>-Ereignisprozedur hinter dem Aufruf der Methode <b>InitTreeView <\/b>noch die Eigenschaft <b>LineStyle<\/b> auf <b>tvwTreeLines <\/b>einstellen:<\/p>\n<pre>        .LineStyle = tvwTreeLines<\/pre>\n<p>Dies ist eine von mehreren Eigenschaften, die das Aussehen des TreeViews beeinflussen. Viele davon werden automatisch auf bestimmte Standardwerte eingestellt, die nicht unbedingt den &uuml;blicherweise beim TreeView-Steuerelement voreingestellten Werten entsprechen. Sie k&ouml;nnen diese Eigenschaften jedoch per Code f&uuml;r <b>objTreeViewHandler <\/b>einstellen.<\/p>\n<p>Noch ein kleiner Hinweis: Einstellungen, die Sie direkt im Eigenschaften-Dialog des TreeView-Steuerelements vornehmen, werden per Code &uuml;berschrieben. Sie k&ouml;nnen sich dies also direkt sparen und die entsprechenden Einstellungen im <b>Form_Open<\/b>-Ereignis hinter dem Aufruf der <b>InitTreeView<\/b>-Methode platzieren.<\/p>\n<p>Kommen wir aber nun zum Anlegen von Projekten: Dazu legen Sie im TreeView-Konfigurator f&uuml;r den Eintrag <b>tblRoot <\/b>ein <b>Kontextmen&uuml; <\/b>mit dem Eintrag <b>Neues Projekt <\/b>und dem Parameter <b>AddProject <\/b>an.<\/p>\n<p>Dieses erscheint dann auch beim n&auml;chsten &Ouml;ffnen des Formulars <b>frmProjekte<\/b>.<\/p>\n<p>Zum Anlegen eines neuen Projekts brauchen Sie ein paar Zeilen mehr als zum L&ouml;schen eines Elements &#8211; in einfachsten Fall aber auch nicht viel mehr. Dabei gehen wir davon aus, dass Sie einfach nur den Projektnamen eingeben m&uuml;ssen, um den neuen Datensatz anzulegen.<\/p>\n<p>Dies erledigen wir ganz schnell mit einer <b>InputBox<\/b>. Wenn die Konsistenz Ihrer Daten die Eingabe weiterer Informationen erfordert, schauen Sie sich die n&auml;chste Variante an.<\/p>\n<p>Im vorliegenden einfachen Fall deklarieren Sie zun&auml;chst zwei Variablen in der Ereignisprozedur <b>objTreeViewHandler_ShortcutMenuClick<\/b>, die Sie bereits zuvor kennengelernt haben:<\/p>\n<pre>        Dim strProjekt As String\r\n        Dim lngProjektID As Long<\/pre>\n<p>Dann erweitern Sie das bestehende <b>Select Case<\/b>-Konstrukt wie in Listing 3.<\/p>\n<p>Die Anweisungen fragen zun&auml;chst per <b>InputBox <\/b>den Namen des neuen Projekts ab und schreiben dann einen neuen Datensatz in die Tabelle <b>tblProjekte<\/b>.<\/p>\n<p>Auch hier soll der neue Datensatz gleich im TreeView angezeigt werden, was ein Aufruf der Methode <b>NewChildNode <\/b>des Objekts <b>objTreeViewHandler <\/b>erledigt. Dieser erwartet zwei Parameter: den Namen der Tabelle sowie den Wert des Prim&auml;rschl&uuml;sselfelds der Tabelle.<\/p>\n<p>Woher wei&szlig; diese Methode, an welches Element es das neue Element anf&uuml;gen soll Es nimmt ganz einfach das aktuell ausgew&auml;hlte Element, dessen Kontextmen&uuml; den Vorgang ins Rollen gebracht hat. Den Namen der Tabelle m&uuml;ssen Sie angeben, weil Sie ja auch Eintr&auml;ge verschiedener Tabellen unterhalb eines einzigen Elements speichern k&ouml;nnen, und die Angabe des Prim&auml;rschl&uuml;sselwerts ist zwingend notwendig, weil der TreeViewHandler sonst nicht wei&szlig;, welches Element er dem TreeView hinzuf&uuml;gen soll.<\/p>\n<p><b>Elemente hinzuf&uuml;gen, die zweite<\/b><\/p>\n<p>Wenn das neue Element mehr als die Angabe der Bezeichnung erfordert, um in der entsprechenden Tabelle angelegt zu werden, kommen Sie mit einer <b>InputBox <\/b>nicht aus und das Anzeigen mehrerer <b>InputBox<\/b>-Fenster hintereinander ist definitiv nicht ergonomisch.<\/p>\n<p>Stattdessen bauen Sie einfach ein Formular, das die entsprechende Tabelle als Datenherkunft besitzt und die ben&ouml;tigten Felder abfragt. &Ouml;ffnen Sie das Formular als modalen Dialog und machen Sie es nach einem Klick auf die <b>OK<\/b>-Schaltfl&auml;che zun&auml;chst unsichtbar, um den Wert des Prim&auml;rschl&uuml;sselfelds des neu hinzugef&uuml;gten Datensatzes auszulesen und es dann zu schlie&szlig;en.<\/p>\n<p>Ist die ID bekannt, k&ouml;nnen Sie den Vorgang wie zuvor beschrieben mit einem Aufruf der Methode <b>NewChildNode <\/b>fortsetzen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Funktionen der aktuellen Version haben Sie in diesem Beitrag kennengelernt. In der L&ouml;sung aus dem Beitrag <b>Softwareprojektverwaltung <\/b>(s. Shortlink 669) haben wir den TreeView-Konfigurator eingesetzt und ein Formular mit umfangreichen Funktionen damit ausgestattet.<\/p>\n<p>Mit dem TreeView-Konfigurator erhalten Sie ein Werkzeug, das die Erstellung und Konfiguration von TreeView-Steuerelementen ma&szlig;geblich vereinfacht. Sie brauchen einfach nur noch die Tabellen entsprechend aufzubauen und festzulegen, was bei verschiedenen Aktionen wie dem einfachen oder doppelten Anklicken von Elementen oder der Auswahl von Kontextmen&uuml;punkten geschehen soll.<\/p>\n<p>Auch die Konfiguration der Kontextmen&uuml;eintr&auml;ge w&auml;re sehr viel aufwendiger, wenn Sie dies komplett per Code realisieren m&uuml;ssten.<\/p>\n<p>Die bisher verwendeten Funktionen sind allerdings noch nicht das Ende der Fahnenstange, es gibt noch zahlreiche andere M&ouml;glichkeiten, die umgesetzt werden k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Anpassen der Reihenfolge. Hier w&auml;re es n&ouml;tig, die betroffenen Felder mit einem zus&auml;tzlichen Feld namens <b>ReihenfolgeID <\/b>auszustatten, um die Anzeige einer individuellen Reihenfolge zu erm&ouml;glichen.<\/li>\n<li class=\"aufz-hlung\">Damit einherginge eine Funktion, mit der sich die Reihenfolge innerhalb des TreeView-Steuerelements ver&auml;ndern l&auml;sst. Dazu gibt es zwei M&ouml;glichkeiten: entweder per Drag and Drop oder durch das Markieren des zu verschiebenden Elements und Bet&auml;tigen einer Tastenkombination wie <b>Strg <\/b>und den Pfeiltasten.<\/li>\n<li class=\"aufz-hlung\">Drag and Drop allgemein: Je nach dem Aufbau der Daten sollte Drag and Drop angeboten werden, um beispielsweise die Hierarchie in einem Mitarbeiterbaum anpassen zu k&ouml;nnen. Wichtig ist dabei eine Pr&uuml;fung der Kompatibilit&auml;t von verschobenem Element und dem Zielelement.<\/li>\n<li class=\"aufz-hlung\">Kontextmen&uuml;funktionen zum Kopieren und Verschieben von Elementen k&ouml;nnen alternativ oder erg&auml;nzend zur oben erw&auml;hnten Drag-and-Drop-Funktion angeboten werden.<\/li>\n<\/ul>\n<p>Wenn die aktuelle Version noch nicht alle Funktionen bietet, die Sie ben&ouml;tigen, k&ouml;nnen Sie das TreeView-Steuerelement nat&uuml;rlich wie gewohnt um weitere Funktionen erg&auml;nzen. Vergessen Sie aber nicht, uns zu berichten, was noch fehlt!<\/p>\n<p>Der TreeView-Konfigurator wird von uns weiterentwickelt. Wenn Sie mit der hier vorgestellten Version experimentieren und Sie neue Ideen haben, was man noch damit anstellen k&ouml;nnte, schreiben Sie uns einfach eine Mail an <b>info@access-im-unternehmen.de<\/b>.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Hinzuf&uuml;gen eines Datensatzes per Kontextmen&uuml;<\/p>\n<pre>        Select Case strParameter\r\n        ...\r\n        Case \"AddProject\"\r\n        strProjekt = InputBox(\"Geben Sie die Bezeichnung des neuen Projekts an.\", \"Neues Projekt\")\r\n        If Len(strProjekt) &gt; 0 Then\r\n            dbs.Execute \"INSERT INTO tblProjekte(Projekt, RootID) VALUES(&euro;&#154;\" &amp; strProjekt _\r\n            &amp; \"&euro;, \" &amp; lngPKIDValue &amp; \")\", dbFailOnError\r\n            lngProjektID = dbs.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n            objTreeViewHandler.NewChildNode \"tblProjekte\", lngProjektID\r\n        End If\r\n        End Select<\/pre>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TreeViewConfigurator.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{950B134E-EA8F-4133-B874-806E44F37DCE}\/aiu_667.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8222;Ein TreeView f&uuml;llen &#8211; mit hierarchischen Daten Das ist doch wohl ein alter Hut!&#8220; Das stimmt wohl, denn genau daf&uuml;r ist dieses Steuerelement ja nun auch gemacht. Wir vereinfachen das F&uuml;llen des TreeViews aber ein wenig, indem wir eine Methode bereitstellen, bei der Sie nur noch die Namen der betroffenen Tabellen in eine weitere Tabelle schreiben und die beim Klicken auf die Elemente des TreeViews durchzuf&uuml;hrenden Aktionen festlegen m&uuml;ssen.<\/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":[662009,66032009,44000028,44000023],"tags":[],"class_list":["post-55000667","post","type-post","status-publish","format-standard","hentry","category-662009","category-66032009","category-Ergonomie_und_Benutzeroberflaeche","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>TreeView-Konfigurator - 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\/TreeViewKonfigurator\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TreeView-Konfigurator\" \/>\n<meta property=\"og:description\" content=\"&quot;Ein TreeView f&uuml;llen - mit hierarchischen Daten Das ist doch wohl ein alter Hut!&quot; Das stimmt wohl, denn genau daf&uuml;r ist dieses Steuerelement ja nun auch gemacht. Wir vereinfachen das F&uuml;llen des TreeViews aber ein wenig, indem wir eine Methode bereitstellen, bei der Sie nur noch die Namen der betroffenen Tabellen in eine weitere Tabelle schreiben und die beim Klicken auf die Elemente des TreeViews durchzuf&uuml;hrenden Aktionen festlegen m&uuml;ssen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:23:35+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28\" \/>\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=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"TreeView-Konfigurator\",\"datePublished\":\"2020-05-22T22:23:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/\"},\"wordCount\":4967,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d120a1566b8849588519135ff5843e28\",\"articleSection\":[\"2009\",\"3\\\/2009\",\"Ergonomie und Benutzeroberfl\u00e4che\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/\",\"name\":\"TreeView-Konfigurator - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d120a1566b8849588519135ff5843e28\",\"datePublished\":\"2020-05-22T22:23:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d120a1566b8849588519135ff5843e28\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d120a1566b8849588519135ff5843e28\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeViewKonfigurator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TreeView-Konfigurator\"}]},{\"@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":"TreeView-Konfigurator - 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\/TreeViewKonfigurator\/","og_locale":"de_DE","og_type":"article","og_title":"TreeView-Konfigurator","og_description":"\"Ein TreeView f&uuml;llen - mit hierarchischen Daten Das ist doch wohl ein alter Hut!\" Das stimmt wohl, denn genau daf&uuml;r ist dieses Steuerelement ja nun auch gemacht. Wir vereinfachen das F&uuml;llen des TreeViews aber ein wenig, indem wir eine Methode bereitstellen, bei der Sie nur noch die Namen der betroffenen Tabellen in eine weitere Tabelle schreiben und die beim Klicken auf die Elemente des TreeViews durchzuf&uuml;hrenden Aktionen festlegen m&uuml;ssen.","og_url":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:23:35+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"TreeView-Konfigurator","datePublished":"2020-05-22T22:23:35+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/"},"wordCount":4967,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28","articleSection":["2009","3\/2009","Ergonomie und Benutzeroberfl\u00e4che","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/","url":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/","name":"TreeView-Konfigurator - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28","datePublished":"2020-05-22T22:23:35+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/d120a1566b8849588519135ff5843e28"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/TreeViewKonfigurator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"TreeView-Konfigurator"}]},{"@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\/55000667","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=55000667"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000667\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}