{"id":55000480,"date":"2020-04-01T00:00:00","date_gmt":"2020-07-17T19:18:43","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=480"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kategorien_per_TreeView_verwalten","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html","title":{"rendered":"Kategorien per TreeView verwalten"},"content":{"rendered":"<p class='introduction'>Kategorien und untergeordnete Kategorien sind ein gutes Beispiel f&uuml;r Daten aus reflexiven Tabellen. Das perfekte Steuer-element f&uuml;r die Verwaltung solcher Daten ist das TreeView-Steuerelement. In diesem Artikel schauen wir uns an, wie Sie die Kategorien einer Datenbank im TreeView-Steuerelement anzeigen und wie Sie dem Benutzer erm&ouml;glichen, diese zu verwalten &#8211; also neue Kategorien hinzuzuf&uuml;gen und bestehende Kategorien zu l&ouml;schen, umzubenennen oder anderen Kategorien unterzuordnen.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>2001_KategorienPerTreeView.accdb<\/b>.<\/p>\n<h2>Tabellen zum Verwalten der Kategorien<\/h2>\n<p>Wenn Sie mit Daten in einer reflexiven Beziehung arbeiten wollen, m&uuml;ssen Sie entscheiden, ob Sie das Feld zum Herstellen der Hierarchie direkt in der Tabelle mit den Daten unterbringen oder ob Sie eine zus&auml;tzliche Tabelle zum Herstellen der reflexiven Beziehung integrieren. Wie dies gelingt, zeigen wir im Artikel <b>Reflexive Daten in Tabellen<\/b>. Im Artikel <b>Reflexive Daten in Abfragen <\/b>zeigen wir dann, dass mit einer Abfrage auch die Daten aus einer Tabelle mit einer Hilfstabelle zur Abbildung der reflexiven Beziehung in der gleichen Form wie in der Tabelle mit integrierter reflexiver Beziehung dargestellt werden k&ouml;nnen.<\/p>\n<p>Wir verwenden an dieser Stelle die im erstgenannten Artikel beschriebenen Tabellen <b>tblKategorien2 <\/b>und <b>tblKategoriezuordnungen <\/b>als Datenquelle zum F&uuml;llen des <b>TreeView<\/b>-Steuerelements &#8211; allein deshalb, weil hier etwas andere Schritte zum Verwalten der Daten des <b>TreeView<\/b>-Steuerelements n&ouml;tig sind als bei einer einzelnen Tabelle. Und die Vorgehensweise bei einer einzelnen Tabelle wurden bereits an anderer Stelle dokumentiert. Die Quelle zum F&uuml;llen unseres <b>TreeView<\/b>-Steuerelements beziehen wir aus der Abfrage <b>qryKategorien <\/b>aus Bild 1, welche die Daten der beiden Tabellen <b>tblKategorien2 <\/b>und <b>tblKategoriezuordnungen <\/b>so zusammenfasst, also ob diese aus einer einzigen Tabelle stammen, welche die reflexive Beziehung &uuml;ber ein eigenes Feld herstellt.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_001.png\" alt=\"Datenbasis f&uuml;r das TreeView-Steuerelement\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Datenbasis f&uuml;r das TreeView-Steuerelement<\/p>\n<h2>Formulareinstellungen<\/h2>\n<p>Das Formular, in dem wir das <b>TreeView<\/b>-Steuerelement anlegen wollen, nennen wir <b>frmKategorienTreeView<\/b>. Die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>stellen wir allesamt auf <b>Nein <\/b>und <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<h2>TreeView hinzuf&uuml;gen<\/h2>\n<p>Um das <b>TreeView<\/b>-Steuerelement zu einem neuen, leeren Formular hinzuzuf&uuml;gen, w&auml;hlen Sie aus dem Ribbon den Eintrag <b>Entwurf|Steuerelemente|ActiveX-Steuerelemente <\/b>aus. Im Dialog <b>ActiveX-Steuerelement einf&uuml;gen <\/b>selektieren Sie dann den Eintrag <b>Microsoft TreeView Control, version 6.0 <\/b>und klicken auf <b>OK<\/b> (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_002.png\" alt=\"Einf&uuml;gen des TreeView-Steuerelements\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Einf&uuml;gen des TreeView-Steuerelements<\/p>\n<p>Das <b>TreeView<\/b>-Steuerelement wird dann ganz klein im linken oberen Bereich des Formularentwurfs eingef&uuml;gt. Also passen Sie zun&auml;chst die Gr&ouml;&szlig;e an und stellen dann die <b>Verankern<\/b>-Eigenschaften so ein, dass sich das Steuer-element entsprechend Ihren W&uuml;nschen mit der &auml;nderung der Gr&ouml;&szlig;e des Formulars anpasst. Wir w&auml;hlen es so, dass sich die H&ouml;he des <b>TreeView<\/b>-Steuerelements mit dem Formular &auml;ndert und legen dazu f&uuml;r die Eigenschaft <b>Vertikaler Anker <\/b>den Wert <b>Beide <\/b>fest (siehe Bild 3). Au&szlig;erdem stellen wir den Namen des neuen Steuerelements auf <b>ctlTreeView <\/b>ein.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_003.png\" alt=\"Das Formular mit dem jungfr&auml;ulichen TreeView-Steuerelement\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Das Formular mit dem jungfr&auml;ulichen TreeView-Steuerelement<\/p>\n<p>Die &uuml;brigen ben&ouml;tigten Eigenschaften des <b>TreeView<\/b>-Steuerelements stellen wir per VBA beim Laden des Formulars ein. Dort erledigen wir auch das F&uuml;llen mit den Daten der Abfrage <b>qryKategorien<\/b>.<\/p>\n<h2>ImageList-Steuerelement hinzuf&uuml;gen<\/h2>\n<p>Wir wollen ein optisch ansprechendes <b>TreeView<\/b>-Steuerelement erzeugen, also soll dieses auch Icons f&uuml;r die einzelnen Eintr&auml;ge anzeigen. Dazu ben&ouml;tigen wir noch ein <b>Image-List<\/b>-Steuerelement, welches die Bilder f&uuml;r das <b>TreeView<\/b>-Steuerelement verwaltet. Das <b>ImageList<\/b>-Steuerelement f&uuml;gen wir wie das <b>TreeView<\/b>-Steuerelement zum Formular hinzu. Sie k&ouml;nnen es an Ort und Stelle belassen, da man es nach dem Anzeigen des Formulars in der Formularansicht ohnehin nicht sieht. Das Steuer-element erh&auml;lt den Namen <b>ctl-ImageList<\/b>. Klicken Sie dann doppelt auf das Steuer-element, um ein Bild hinzuzuf&uuml;gen.<\/p>\n<p>Auf der ersten Seite des nun erscheinenden Eigenschaften-Dialog stellen Sie die Option zur Auswahl der Bildgr&ouml;&szlig;e auf <b>16 x 16 <\/b>ein (siehe Bild 4).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_004.png\" alt=\"Einstellungen f&uuml;r das ImageList-Steuerelement\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Einstellungen f&uuml;r das ImageList-Steuerelement<\/p>\n<p>Auf der zweiten Seite klicken Sie auf <b>Insert Picture <\/b>und w&auml;hlen im nun erscheinenden Dialog die gew&uuml;nschte Bilddatei aus. Wir verwenden eine <b>.ico<\/b>-Datei namens <b>Folder.ico<\/b>.<\/p>\n<p>Nach dem Einf&uuml;gen legen wir noch die Eigenschaft <b>Key <\/b>f&uuml;r dieses Bild auf <b>folder <\/b>fest (siehe Bild 5).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_005.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_005.png\" alt=\"Hinzuf&uuml;gen einer Bilddatei\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Hinzuf&uuml;gen einer Bilddatei<\/p>\n<h2>ImageList-Steuerelement zuweisen<\/h2>\n<p>Das Zuweisen des <b>ImageList<\/b>-Steuerelements zum <b>TreeView<\/b>-Steuerelement erledigen wir &uuml;ber den Eigenschaften-Dialog des <b>TreeView<\/b>-Steuerelements. Diesen &ouml;ffnen Sie &uuml;ber den Kontextmen&uuml;-Eintrag <b>TreeCtl-Object|Properties <\/b>des <b>TreeView<\/b>-Steuerelements im Entwurf des Formulars.<\/p>\n<p>Hier finden Sie die Eigenschaft <b>ImageList<\/b> vor. F&uuml;r diese w&auml;hlen wir den Namen des von uns hinzugef&uuml;gten <b>ImageList<\/b>-Steuerelements <b>ctlImageList <\/b>aus (siehe Bild 6).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_006.png\" alt=\"Festlegen des ImageList-Steuerelements\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Festlegen des ImageList-Steuerelements<\/p>\n<h2>Weitere TreeView-Eigenschaften einstellen<\/h2>\n<p>Die &uuml;brigen Eigenschaften stellen wir per VBA in der Ereignisprozedur ein, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Das Ergebnis sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objTreeView<span style=\"color:blue;\"> As <\/span>MSComctlLib.TreeView\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n    <span style=\"color:blue;\">Set<\/span> objTreeView = Me!ctlTreeView.Object\r\n    <span style=\"color:blue;\">With<\/span> objTreeView\r\n        .Appearance = ccFlat\r\n        .BorderStyle = ccNone\r\n        .OLEDragMode = ccOLEDragAutomatic\r\n        .OLEDropMode = ccOLEDropManual\r\n        .Style = tvwTreelinesPlusMinusPictureText\r\n        .LineStyle = tvwRootLines\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    TreeViewFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklarierte Variable <b>objTreeView <\/b>dient dem Referenzieren des <b>TreeView<\/b>-Steuerelements und f&uuml;r das sp&auml;tere Anlegen von Ereignisprozeduren f&uuml;r dieses Steuer-element. Die <b>Form_Load<\/b>-Prozedur weist dieser Variablen zun&auml;chst das Steuerelement zu, was nicht einfach &uuml;ber den Namen des Steuerelements geschieht &#8211; bei ActiveX-Steuerelementen ist zus&auml;tzlich die Angabe der Eigenschaft <b>Object <\/b>n&ouml;tig.<\/p>\n<p>Die Prozedur stellt einige Eigenschaften des Steuerelements ein, zum Beispiel das Aussehen auf <b>Flat <\/b>statt <b>3d<\/b>, die Rahmenart, das Verhalten bei Drag and Drop, den Stil (Plus-\/Minuszeichen, Icons und Text) sowie den Stil der Linien. Wenn Sie die Unterschiede sehen wollen, k&ouml;nnen Sie mit diesen Eigenschaften experimentieren.<\/p>\n<h2>TreeView f&uuml;llen<\/h2>\n<p>Au&szlig;erdem ruft diese Prozedur die Routine <b>TreeViewFuellen <\/b>auf. Diese finden Sie in Listing 1. Die Prozedur leert zun&auml;chst das <b>TreeView<\/b>-Steuerelement mit der <b>Clear<\/b>-Methode der <b>Nodes<\/b>-Auflistung.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>TreeViewFuellen()\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;\">Set<\/span> db = CurrentDb\r\n     objTreeView.Nodes.Clear\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM qryKategorien WHERE ParentKategorieID IS NULL\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         objTreeView.Nodes.Add , , \"k\" & rst!kategorieID, rst!Kategorie, \"folder\"\r\n         TreeViewFuellen_Rek db, rst!kategorieID\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: F&uuml;llen der ersten Ebene des TreeView-Steuerelements<\/p>\n<p>Dann f&uuml;llt es ein <b>Recordset<\/b>-Objekt mit allen Datens&auml;tzen der Abrage <b>qryKategorien<\/b>, deren Feld <b>ParentKategorieID <\/b>leer ist. Damit erhalten wir alle Datens&auml;tze der ersten Ebene, also diejenigen, die keine &uuml;bergeordneten Kategorien aufweisen. Diese durchl&auml;uft die Prozedur in einer <b>Do While<\/b>-Schleife.<\/p>\n<p>Innerhalb der Schleife geschehen zwei Dinge:<\/p>\n<ul>\n<li>Es wird ein Element im <b>TreeView<\/b>-Steuerelement f&uuml;r diesen Datensatz angelegt. Dabei &uuml;bergibt die Prozedur der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung des <b>TreeView<\/b>-Steuerelements einen eindeutigen Bezeichner, der aus dem Buchstaben <b>a <\/b>und dem Prim&auml;rschl&uuml;sselwert des Datensatzes besteht, den anzuzeigenden Text aus dem Feld <b>Kategorie <\/b>sowie den Key des f&uuml;r dieses Element anzuzeigenden Icons aus dem <b>ImageList<\/b>-Steuerelements &#8211; hier <b>folder<\/b>.<\/li>\n<li>Au&szlig;erdem wird die Prozedur <b>TreeViewFuellen_Rek <\/b>aufgerufen, die sich um das F&uuml;llen der untergeordneten Elemente k&uuml;mmert (siehe Listing 2).<\/li>\n<pre><span style=\"color:blue;\">Private Sub <\/span>TreeViewFuellen_Rek(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngParentID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM qryKategorien WHERE parentKategorieID = \" & lngParentID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         objTreeView.Nodes.Add \"k\" & lngParentID, tvwChild, \"k\" & rst!kategorieID, rst!Kategorie, \"folder\"\r\n         TreeViewFuellen_Rek db, rst!kategorieID\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: F&uuml;llen der weiteren Ebenen des TreeView-Steuerelements<\/p>\n<\/ul>\n<h2>Untergeordnete Elemente hinzuf&uuml;gen<\/h2>\n<p>Die Prozedur <b>TreeViewFuellen_Rek <\/b>erwartet mit <b>db <\/b>einen Verweis auf das <b>Database<\/b>-Objekt der aktuellen Datenbank sowie mit <b>lngParentID <\/b>den Prim&auml;rschl&uuml;sselwert des Elements, dessen untergeordnete Elemente in dieser Prozedur angelegt werden sollen.<\/p>\n<p>Die Prozedur durchl&auml;uft wiederum die Datens&auml;tze eines Recordsets. Diesmal enth&auml;lt das Recordset jedoch nicht alle Datens&auml;tze, die kein &uuml;bergeordnetes Element enthalten, sondern diejenigen, deren &uuml;bergeordnetes Element das mit <b>lngParentID <\/b>&uuml;bergebene ist. Innerhalb der folgenden <b>Do While<\/b>-Schleife wird jeweils ein Element dem <b>TreeView<\/b>-Steuerelement hinzugef&uuml;gt.<\/p>\n<p>W&auml;hrend wir in der Prozedur <b>TreeViewFuellen <\/b>die ersten beiden Parameter der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung leer lassen konnten, m&uuml;ssen wir diese nun f&uuml;llen, um die Verwandschaftsbeziehung zwischen den Elementen anzugeben. Also f&uuml;llen wir den ersten Parameter mit dem <b>Key<\/b>-Wert des Elements, dem wir das neue Element unterordnen wollen. Diesen Keywert stellen wir aus dem Buchstaben <b>a <\/b>und dem mit <b>lngParentID <\/b>gelieferten Prim&auml;rschl&uuml;sselwert des &uuml;bergeordneten Elements zusammen. Der zweite Parameter gibt das Verwandtschaftsverh&auml;ltnis an, in diesem Fall <b>tvwChild <\/b>f&uuml;r ein untergeordnetes Element. Die &uuml;brigen Parameter f&uuml;llen wir wie bereits f&uuml;r die aufrufende Prozedur beschrieben.<\/p>\n<p>Danach rufen wir erneut die Prozedur <b>TreeViewFuellen_Rek <\/b>auf. Diese ruft sich erst dann nicht mehr selbst auf, wenn das ermittelte Recordset der untergeordneten Elemente leer ist. Auf diese Weise f&uuml;llen wir das <b>TreeView<\/b>-Steuerelement, das anschlie&szlig;end wie in Bild 7 aussieht.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_007.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_007.png\" alt=\"Aussehen des TreeView-Steuerelements nach dem &ouml;ffnen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 7: Aussehen des TreeView-Steuerelements nach dem &ouml;ffnen<\/p>\n<p>Klappen wir die untergeordneten Elemente per Mausklick auf die <b>Plus<\/b>-Zeichen auf, erhalten wir das <b>TreeView<\/b>-Steuerelement aus Bild 8.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_008.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_008.png\" alt=\"Aussehen des TreeView-Steuerelements mit aufgeklappten Unterelementen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 8: Aussehen des TreeView-Steuerelements mit aufgeklappten Unterelementen<\/p>\n<h2>Elemente hinzuf&uuml;gen<\/h2>\n<p>Wenn Sie nun ein Element hinzuf&uuml;gen wollen, finden Sie keine eingebaute Funktion f&uuml;r diesen Zweck vor &#8211; wir m&uuml;ssen diese komplett selbst erzeugen. Hierbei unterscheiden wir zwischen zwei F&auml;llen:<\/p>\n<ul>\n<li>Sie erzeugen ein Element der obersten Ebene oder<\/li>\n<li>Sie erzeugen ein Element, das einem bereits vorhandenen Element untergeordnet wird.<\/li>\n<\/ul>\n<p>Beides wollen wir &uuml;ber Kontextmen&uuml;s erledigen, weil dies die ergonomischste Variante ist. Um mit Kontextmen&uuml;s zu arbeiten, ben&ouml;tigen wir einen Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library<\/b>, die unter Access 2016 im <b>Verweise<\/b>-Dialog (VBA-Editor, Men&uuml;eintrag <b>Extras|Verweise<\/b>) unter <b>office <\/b>abgelegt ist (siehe Bild 9).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_480_009.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_480_009.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 9: Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek<\/p>\n<p>Dann f&uuml;gen wir eine Prozedur hinzu, die beim Anklicken des <b>TreeView<\/b>-Steuerelements mit der Maus ausgel&ouml;st wird. Diese Prozedur wird durch das Ereignis <b>MouseDown <\/b>ausgel&ouml;st. Die passende Ereignisprozedur legen wir an, indem Sie im Codefenster der Klasse <b>Form_frmKategorienTreeView <\/b>im linken Kombinationsfeld den Eintrag <b>ctlTreeView <\/b>ausw&auml;hlen und im rechten den Eintrag <b>MouseDown<\/b>.<\/p>\n<p>Dies erstellt dann automatisch die gew&uuml;nschte Ereignisprozedur, die wir dann wie in Listing 3 f&uuml;llen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlTreeView_MouseDown(ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, ByVal x<span style=\"color:blue;\"> As Long<\/span>, ByVal y<span style=\"color:blue;\"> As Long<\/span>)\r\n      <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n      <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n      Select Case Button\r\n          <span style=\"color:blue;\">Case <\/span>acRightButton\r\n              <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.HitTest(x, y)\r\n              <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objNode Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                  strTyp = <span style=\"color:blue;\">Left<\/span>(objNode.Key, 1)\r\n                  lngID = <span style=\"color:blue;\">Mid<\/span>(objNode.Key, 2)\r\n                  strText = objNode.Text\r\n                  Select Case strTyp\r\n                      <span style=\"color:blue;\">Case <\/span>\"k\"\r\n                          KontextmenueKategorieAnzeigen lngID, strText\r\n                  <span style=\"color:blue;\">End Select<\/span>\r\n              <span style=\"color:blue;\">Else<\/span>\r\n                  KontextmenueRootAnzeigen\r\n              <span style=\"color:blue;\">End If<\/span>\r\n      <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 3: Aufrufen von Kontextmen&uuml;s<\/p>\n<p>Wir wollen, dass beim Anklicken eines der vorhanden Eintr&auml;ge ein Kontextmen&uuml; angezeigt wird, dass die folgenden Befehle anzeigt:<\/p>\n<ul>\n<li><b>Kategorie einf&uuml;gen<\/b><\/li>\n<li><b>Kategorie l&ouml;schen<\/b><\/li>\n<\/ul>\n<p>Beim Anklicken des leeren Raumes im <b>TreeView<\/b>-Steuerelement soll ein Kontextmen&uuml; mit dem Befehl <b>Kategorie einf&uuml;gen <\/b>anzeigen. Wir ben&ouml;tigen also zwei Kontextmen&uuml;s. <\/p>\n<p>Um dies zu erledigen, pr&uuml;fen wir in der Prozedur <b>ctlTreeView_MouseDown<\/b> zun&auml;chst, mit welcher Maustaste der Benutzer das <b>TreeView<\/b>-Steuerelement angeklickt hat. Nur im Falle der rechten Maustaste sollen die weiteren Anweisungen der Prozedur ausgef&uuml;hrt werden, was wir durch eine entsprechende <b>If&#8230;Then<\/b>-Bedingung absichern. Hat der Benutzer das <b>TreeView<\/b>-Steuerelement mit der rechten Maustaste angeklickt, untersuchen wir, ob er ein Element angeklickt hat oder den freien Raum im <b>TreeView<\/b>-Steuerelement. Dazu f&uuml;hren wir die <b>HitTest<\/b>-Funktion aus und &uuml;bergeben die mit den Parametern <b>x <\/b>und <b>y <\/b>mitgegebene Position des Mausklicks als Parameter. Hat der Benutzer einen der Eintr&auml;ge angeklickt, ist <b>objNode <\/b>anschlie&szlig;end mit einem Verweis auf diesen Eintrag gef&uuml;llt.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000480\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000480?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000480\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"57b4da54a7\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kategorien und untergeordnete Kategorien sind ein gutes Beispiel f&uuml;r Daten aus reflexiven Tabellen. Das perfekte Steuer-element f&uuml;r die Verwaltung solcher Daten ist das TreeView-Steuerelement. In diesem Artikel schauen wir uns an, wie Sie die Kategorien einer Datenbank im TreeView-Steuerelement anzeigen und wie Sie dem Benutzer erm&ouml;glichen, diese zu verwalten &#8211; also neue Kategorien hinzuzuf&uuml;gen und bestehende Kategorien zu l&ouml;schen, umzubenennen oder anderen Kategorien unterzuordnen.<\/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":[66022020,662020,44000012],"tags":[],"class_list":["post-55000480","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-Steuerelemente"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kategorien per TreeView verwalten - Access [basics]<\/title>\n<meta name=\"description\" content=\"Kategorien und untergeordnete Kategorien sind ein gutes Beispiel f\u00fcr Daten aus reflexiven Tabellen. Das perfekte Steuer\u00adelement f\u00fcr die Verwaltung solcher Daten ist das TreeView-Steuerelement. In diesem Artikel schauen wir uns an, wie Sie die Kategorien einer Datenbank im TreeView-Steuerelement anzeigen und wie Sie dem Benutzer erm\u00f6glichen, diese zu verwalten \u2013 also neue Kategorien hinzuzuf\u00fcgen und bestehende Kategorien zu l\u00f6schen, umzubenennen oder anderen Kategorien unterzuordnen.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kategorien per TreeView verwalten - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Kategorien und untergeordnete Kategorien sind ein gutes Beispiel f\u00fcr Daten aus reflexiven Tabellen. Das perfekte Steuer\u00adelement f\u00fcr die Verwaltung solcher Daten ist das TreeView-Steuerelement. In diesem Artikel schauen wir uns an, wie Sie die Kategorien einer Datenbank im TreeView-Steuerelement anzeigen und wie Sie dem Benutzer erm\u00f6glichen, diese zu verwalten \u2013 also neue Kategorien hinzuzuf\u00fcgen und bestehende Kategorien zu l\u00f6schen, umzubenennen oder anderen Kategorien unterzuordnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-17T19:18:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_480_001.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"28\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_480_001.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\",\"name\":\"Kategorien per TreeView verwalten - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html#primaryimage\"},\"datePublished\":\"2020-07-17T19:18:43+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Kategorien und untergeordnete Kategorien sind ein gutes Beispiel f\\u00fcr Daten aus reflexiven Tabellen. Das perfekte Steuer\\u00adelement f\\u00fcr die Verwaltung solcher Daten ist das TreeView-Steuerelement. In diesem Artikel schauen wir uns an, wie Sie die Kategorien einer Datenbank im TreeView-Steuerelement anzeigen und wie Sie dem Benutzer erm\\u00f6glichen, diese zu verwalten \\u2013 also neue Kategorien hinzuzuf\\u00fcgen und bestehende Kategorien zu l\\u00f6schen, umzubenennen oder anderen Kategorien unterzuordnen.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Kategorien_per_TreeView_verwalten.html\",\"name\":\"Kategorien per TreeView verwalten\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000480"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000480\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}