{"id":55001243,"date":"2020-08-01T00:00:00","date_gmt":"2020-08-05T10:25:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1243"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"TreeView_mit_Kontextmenue","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/","title":{"rendered":"TreeView mit Kontextmen&uuml;"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>TreeViews sind sehr flexible Steuer-elemente, die sich vor allem zur Darstellung von Daten in hierarchischen Strukturen etabliert haben. Sie bieten viele verschiedene M&ouml;glichkeiten zur Visualisierung von Daten. Au&szlig;erdem lassen sich die g&auml;ngigen Ereignisse f&uuml;r die Elemente des TreeView-Steuerelements abbilden &#8211; zum Beispiel Mausklicks, Drag and Drop und so weiter. Leider bietet das TreeView-Steuerelement keine eingebaute M&ouml;glichkeit, wie bei den Standard-Steuerelementen Kontextmen&uuml;s anzuzeigen. Daher schauen wir uns in diesem Beitrag an, wie Sie ein TreeView-Steuerelement um Kontextmen&uuml;-Funktionen erweitern und welche Strategien dabei wichtig sind.<\/b><\/p>\n<p><b>Aktionen zu TreeView-Eintr&auml;gen<\/b><\/p>\n<p>Ein TreeView, das Daten aus verkn&uuml;pften Tabellen hierarchisch anzeigt, ist in vielen Szenarien sinnvoll: egal, ob Sie nun Kunden, Projekte und Aufgaben, Bauteile mit den einzelnen Elementen oder andere Daten abbilden. Sie k&ouml;nnen Elemente auf- und zuklappen, Elemente anklicken, um Details dazu in weiteren Steuerelementen anzuzeigen und vieles mehr.<\/p>\n<p>Was aber noch fehlt, ist die M&ouml;glichkeit, Befehle f&uuml;r das aktuell angeklickte Element anzuzeigen. Wenn das TreeView-Steuerelement beispielsweise einen Kunden anzeigt, m&ouml;chten Sie vielleicht verschiedene Aktionen f&uuml;r diesen Kunden ausf&uuml;hren &#8211; ein neues Projekt anlegen, den Kunden l&ouml;schen oder eine Mail an diesen Kunden schicken.<\/p>\n<p>Nat&uuml;rlich k&ouml;nnte man solche Befehle &uuml;ber Schaltfl&auml;chen ausl&ouml;sen, die in einem Detailformular angezeigt werden, das nach einem Klick auf das Kundenelement im TreeView erscheint.<\/p>\n<p><b>Die L&ouml;sung: Ein Kontextmen&uuml;<\/b><\/p>\n<p>Es geht aber auch noch eleganter, und zwar mit einem Kontextmen&uuml;, das genau die zu dem angeklickten Element geh&ouml;renden Befehle anzeigt.<\/p>\n<p>Ein Kontextmen&uuml; hat den Vorteil, dass es keinen Platz ben&ouml;tigt &#8211; Sie zeigen es an, indem Sie mit der rechten Maustaste auf das Element klicken, w&auml;hlen die gew&uuml;nschte Aktion aus und es verschwindet wieder. Im Detailformular w&uuml;rden die Befehle beziehungsweise die Schaltfl&auml;chen Platz wegnehmen.<\/p>\n<p>Der Nachteil von Kontextmen&uuml;s ist, dass der Benutzer erst einmal wissen muss, dass es diese gibt &#8211; immerhin gibt es in der Regel keinen Hinweis darauf, dass sich durch einen Rechtsklick auf ein Element weitere Optionen erschlie&szlig;en lassen.<\/p>\n<p><b>Beispieldaten<\/b><\/p>\n<p>Die Beispieldaten zu diesem Beitrag stammen aus den beiden Tabellen <b>tblKunden <\/b>und <b>tblProjekte<\/b>. Diese sind &uuml;ber das Fremdschl&uuml;sselfeld <b>KundeID <\/b>der Tabelle <b>tblProjekte <\/b>verkn&uuml;pft (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_001.png\" alt=\"Datenquelle des TreeView-Steuerelements\" width=\"424,7115\" height=\"231,1979\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Datenquelle des TreeView-Steuerelements<\/span><\/b><\/p>\n<p>Die beiden Tabellen haben wir mit einigen Beispieldaten gef&uuml;llt &#8211; siehe Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_004.png\" alt=\"Daten der beiden Tabellen tblKunden und tblProjekte\" width=\"499,6607\" height=\"293,7783\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Daten der beiden Tabellen tblKunden und tblProjekte<\/span><\/b><\/p>\n<p><b>TreeView-Steuerelement<\/b><\/p>\n<p>Das <b>TreeView<\/b>-Steuerelement f&uuml;gen wir unter dem Namen <b>ctlTreeView <\/b>zu einem neuen Formular namens <b>frmKundenProjekte <\/b>hinzu (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_003.png\" alt=\"TreeView und ImageList in der Entwurfsansicht\" width=\"424,7115\" height=\"501,0985\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: TreeView und ImageList in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Hier erkennen Sie auch, dass wir bereits ein <b>ImageList<\/b>-Steuerelement hinzugef&uuml;gt haben.<\/p>\n<p>Dieses nennen wir <b>ctlImageList <\/b>und f&uuml;gen ihm gleich noch zwei Icons hinzu, die wir mit den Werten <b>user <\/b>und <b>folder <\/b>f&uuml;r die Eigenschaft <b>Key<\/b> versehen (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_002.png\" alt=\"Bilder im ImageList-Steuerelement\" width=\"424,7115\" height=\"329,5352\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Bilder im ImageList-Steuerelement<\/span><\/b><\/p>\n<p><b>Formular vorbereiten<\/b><\/p>\n<p>Da das Formular keine Daten anzeigen soll, stellen wir seine Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf den Wert <b>Nein <\/b>ein und <b>Automatisch zentrieren <\/b>auf <b>Ja<\/b>.<\/p>\n<p><b>TreeView formatieren<\/b><\/p>\n<p>Danach stellen wir bereits die notwendigen Eigenschaften f&uuml;r das <b>TreeView<\/b>-Steuerelement ein, was wir per VBA erledigen statt &uuml;ber den Eigenschaften-Dialog des Steuerelements.<\/p>\n<p>Allein das <b>ImageList<\/b>-Steuerelement weisen wir &uuml;ber den Eigenschaften-Dialog zu, und zwar &uuml;ber den Wert <b>ctl-ImageList <\/b>f&uuml;r die Eigenschaft <b>ImageList<\/b>.<\/p>\n<p>Im Klassenmodul des Formulars hinterlegen wir eine Objektvariable f&uuml;r das <b>TreeView<\/b>-Steuerelement:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objTreeView<span style=\"color:blue;\"> As <\/span>MSComctlLib.TreeView<\/pre>\n<p>Dann implementieren wir die Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, und stellen darin die wichtigsten Eigenschaften des <b>TreeView<\/b>-Steuerelements ein:<\/p>\n<pre><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         .LineStyle = tvwRootLines\r\n         .Style = tvwTreelinesPlusMinusPictureText\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     FillTreeView\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dazu geh&ouml;ren die Eigenschaften <b>Appearance <\/b>(wir wollen keinen 3D-Effekt, daher stellen wir diese Eigenschaft auf den Wert <b>ccFlat <\/b>ein), <b>BorderStyle<\/b>, <b>LineStyle <\/b>und <b>Style <\/b>&#8211; diese Eigenschaft erh&auml;lt den Wert <b>tvwTreelinesPlusMinusPictureText<\/b>, damit wir ein TreeView wie in Bild 5 erhalten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_005.png\" alt=\"Kunden und Projekte im TreeView\" width=\"424,7115\" height=\"515,3665\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Kunden und Projekte im TreeView<\/span><\/b><\/p>\n<p>Die letzte Anweisung der Prozedur ruft eine weitere Routine namens <b>FillTreeView <\/b>auf, die wie in Listing 1 aussieht. Diese Routine referenziert zun&auml;chst das <b>Database<\/b>-Objekt der aktuellen Datenbank und f&uuml;llt dann ein <b>Recordset<\/b>-Objekt mit den Daten der Tabelle <b>tblKunden <\/b>&#8211; und zwar nach dem Feld <b>Kunde<\/b> sortiert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FillTreeView()\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>rstKunden<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstProjekte<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstKunden = db.OpenRecordset(\"SELECT * FROM tblKunden ORDER BY Kunde\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstKunden.EOF\r\n         objTreeView.Nodes.Add , , \"k\" & rstKunden!KundeID, rstKunden!Kunde, \"user\"\r\n         <span style=\"color:blue;\">Set<\/span> rstProjekte = db.OpenRecordset(\"SELECT * FROM tblProjekte WHERE KundeID = \" & rstKunden!KundeID, _\r\n             dbOpenDynaset)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstProjekte.EOF\r\n             objTreeView.Nodes.Add \"k\" & rstKunden!KundeID, tvwChild, \"p\" & rstProjekte!ProjektID, _\r\n                 rstProjekte!Projekt, \"folder\"\r\n             rstProjekte.Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         rstKunden.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><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur f&uuml;llt das TreeView-Steuerelement<\/span><\/b><\/p>\n<p>Die Datens&auml;tze dieses Recordsets durchl&auml;uft sie dann in einer <b>Do While<\/b>-Schleife. Innerhalb dieser Schleife erstellt sie zun&auml;chst jeweils ein <b>Node<\/b>-Element im <b>TreeView<\/b>-Steuerelement. Dabei weist sie mit der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung ein Element in der ersten Ebene zu &#8211; deshalb bleiben die ersten beiden Parameter der Methode leer.<\/p>\n<p>Der dritte Parameter gibt den Key an, also einen eindeutigen Identifizierer f&uuml;r das <b>Node<\/b>-Element im <b>TreeView<\/b>-Steuerelement. F&uuml;r den Wert gibt es genau eine Voraussetzung: Er muss mit einem Buchstaben beginnen. Wir k&ouml;nnen also nicht einfach den Prim&auml;rschl&uuml;sselwert des Kunden f&uuml;r die Eigenschaft <b>Key <\/b>angeben.<\/p>\n<p>Das ist aber auch kein Problem, denn wenn wir das tun k&ouml;nnten, w&uuml;rden wir schnell doppelte <b>Key<\/b>-Werte produzieren, denn ein Prim&auml;rschl&uuml;sselwert kann ja durchaus mehrfach in den Tabellen vorkommen, deren Daten im <b>TreeView<\/b>-Steuerelement angezeigt werden sollen.<\/p>\n<p>Also f&uuml;gen wir einfach einen Buchstaben voran, der die Art des Eintrags kennzeichnet &#8211; hier <b>k <\/b>f&uuml;r Kunde -, und f&uuml;gen dahinter den Prim&auml;rschl&uuml;sselwert ein. F&uuml;r den Prim&auml;rschl&uuml;sselwert <b>123 <\/b>lautet der <b>Key<\/b>-Wert dann also <b>k123<\/b>.<\/p>\n<p>Dahinter folgt der anzuzeigende Text, den wir aus dem Feld <b>Kunde <\/b>des Recordsets entnehmen (<b>rstKunden!Kunde<\/b>). Schlie&szlig;lich geben wir f&uuml;r den Parameter <b>Image <\/b>den Wert <b>user <\/b>an.<\/p>\n<p>Dieser entspricht dem Icon aus dem <b>ImageList<\/b>-Steuer-element, das wir in Zusammenhang mit dem Kunden-Element anzeigen wollen.<\/p>\n<p>Danach erstellt die Prozedur ein weiteres Recordset, dass diesmal alle Datens&auml;tze der Tabelle <b>tblProjekte <\/b>enth&auml;lt, die &uuml;ber das Feld <b>KundeID <\/b>mit dem Kunden verkn&uuml;pft sind, den wir gerade im Datensatz der &uuml;bergeordneten <b>Do While<\/b>-Schleife bearbeiten.<\/p>\n<p>Diese Projekt-Datens&auml;tze durchlaufen wir ebenfalls in einer <b>Do While<\/b>-Schleife. Innerhalb der Schleife legen wir f&uuml;r jedes Projekt ein neues Element unterhalb des jeweiligen Kunden-Elements an. F&uuml;r diese Zuordnung nutzen wir die ersten beiden Parameter der <b>Add<\/b>-Methode der <b>Nodes<\/b>-Auflistung.<\/p>\n<p>Der erste nimmt den <b>Key<\/b>-Wert des <b>Node<\/b>-Elements entgegen, unter dem wir das Projekt-Element anlegen wollen.<\/p>\n<p>Der zweite legt fest, in welchem Verh&auml;ltnis das neue Element zu dem mit dem ersten Parameter referenzierten Element stehen soll &#8211; in diesem Fall soll es untergeordnet werden, also verwenden wir den Wert <b>tvwChild<\/b>.<\/p>\n<p>Der dritte, vierte und f&uuml;nfte Parameter werden analog zum  Aufruf der <b>Add<\/b>-Methode f&uuml;r die Kunden-Nodes gef&uuml;llt. Der wichtigste Unterschied ist, dass der Wert der <b>Key<\/b>-Eigenschaft mit <b>p <\/b>beginnt (f&uuml;r Projekt). Au&szlig;erdem verwenden wir das Icon mit der Bezeichnung <b>folder<\/b>.<\/p>\n<p>Auf diese Weise f&uuml;llen wir mit der Prozedur schnell das TreeView mit allen Datens&auml;tzen der beiden Tabellen <b>tblKunden <\/b>und <b>tblProjekte<\/b>.<\/p>\n<p><b>Kontextmen&uuml; anzeigen<\/b><\/p>\n<p>Wenn es keine Eigenschaft gibt, mit der wir ein Kontextmen&uuml; zuweisen k&ouml;nnen und auch kein spezielles Ereignis vorliegt, das dies erledigen w&uuml;rde &#8211; wie zeigen wir das Kontextmen&uuml; dann an<\/p>\n<p><!--30percent--><\/p>\n<p>Das erledigen wir &uuml;ber einen kleinen Umweg, n&auml;mlich &uuml;ber das Ereignis, dass durch das Herunterdr&uuml;cken der rechten Maustaste ausgel&ouml;st wird. Auch daf&uuml;r gibt es kein spezielles Ereignis, daher nutzen wir das Ereignis, das beim Herunterdr&uuml;cken beliebiger Maustasten ausgel&ouml;st wird: n&auml;mlich <b>Bei Maustaste ab<\/b>. Bei ActiveX-Steuerelementen finden wir dieses Ereignis nicht im Eigenschaftsfenster, daher legen wir es direkt &uuml;ber den VBA-Editor an.<\/p>\n<p>Dazu w&auml;hlen Sie im linken Kombinationsfeld den Namen des Steuerelements aus, hier <b>ctlTreeView<\/b>, und dann im rechten Kombinationsfeld den Eintrag <b>MouseDown<\/b>.<\/p>\n<p>Dies legt dann die Ereignisprozedur <b>ctlTreeView_MouseDown<\/b> an (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_006.png\" alt=\"Anlegen der Ereignisprozedur f&uuml;r das Ereignis Bei Maustaste ab\" width=\"649,559\" height=\"416,8241\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen der Ereignisprozedur f&uuml;r das Ereignis Bei Maustaste ab<\/span><\/b><\/p>\n<p><b>Auf rechten Mausklick reagieren<\/b><\/p>\n<p>Die Ereignisprozedur f&uuml;llen wir wie in Listing 2. Sie nimmt unter anderem mit X und Y die aktuelle Position des Mauszeigers entgegen &#8211; diese werden wir gleich noch nutzen.<\/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                         <span style=\"color:blue;\">MsgBox<\/span> \"Rechtsklick auf Kunde '\" & strText & \"'\"\r\n                     <span style=\"color:blue;\">Case <\/span>\"p\"\r\n                         <span style=\"color:blue;\">MsgBox<\/span> \"Rechtsklick auf Projekt '\" & strText & \"'\"\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Rechtsklick auf leeren Bereich\"\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><b><span style=\"color:darkgrey;\">Listing 2: Diese Prozedur reagiert auf Klicks mit der rechten Maustaste.<\/span><\/b><\/p>\n<p>Zun&auml;chst einmal ist zu beachten, dass das Ereignis <b>Bei Maustaste ab <\/b>bei jedem Mausklick ausgel&ouml;st wird &#8211; sowohl mit der linken und der rechten, aber auch mit der mittleren Taste. Welche Maustaste gedr&uuml;ckt wurde, werten wir in einer <b>Select Case<\/b>-Bedingung aus. Diese untersucht den Wert eines weiteren Parameters, n&auml;mlich <b>Button<\/b>.<\/p>\n<p>Hat Button den Wert <b>acRightButton<\/b>, hat der Benutzer die rechte Maustaste verwendet und wir f&uuml;hren die Anweisung im ersten und einzigen <b>Case<\/b>-Zweig der Bedingung aus.<\/p>\n<p>In diesem verwenden wir die soeben erw&auml;hnten Parameter <b>X <\/b>und <b>Y <\/b>in der <b>HitTest<\/b>-Eigenschaft, um herauszufinden, auf welches Element im <b>TreeView<\/b>-Steuerelement der Benutzer geklickt hat.<\/p>\n<p>Sollte <b>HitTest <\/b>einen Verweis auf ein Element des Typs <b>MSComctlLib.Node <\/b>liefern, wird dieser mit der Variablen <b>objNode <\/b>referenziert. Ob dies der Fall ist, pr&uuml;ft die folgende <b>If&#8230;Then<\/b>-Bedingung. Diese pr&uuml;ft, ob <b>objNode <\/b>nicht den Wert <b>Nothing <\/b>aufweist, was bedeutet, dass <b>HitTest <\/b>einen Verweis auf eines der <b>Node<\/b>-Elemente geliefert hat. Ist das der Fall, untersuchen wir das <b>Node<\/b>-Element und lesen einige Informationen daraus aus.<\/p>\n<p><b>Typ des angeklickten Elements ermitteln<\/b><\/p>\n<p>Als Erstes ermitteln wir den Typ des angeklickten Elements, also ob es sich um ein Kunden- oder ein Projekt-Element handelt. Woran k&ouml;nnen wir dies festmachen Am ersten Buchstaben des mit der <b>Key<\/b>-Eigenschaft gelieferten Wertes.<\/p>\n<p>Diesen ermitteln wir mit <b>Left(objNode.Key, 1) <\/b>und speichern das Ergebnis in der Variablen <b>strTyp<\/b>. Au&szlig;erdem ben&ouml;tigen wir gegebenenfalls noch den Prim&auml;rschl&uuml;sselwert des jeweilige Elements. Diesen lesen wir mit <b>Mid(objNode.Key, 2) <\/b>aus, was alle Zeichen der <b>Key<\/b>-Eigenschaft ab dem zweiten Zeichen liefert.<\/p>\n<p>Schlie&szlig;lich lesen wir noch den angezeigten Text in die Variable <b>strText <\/b>ein, den die Eigenschaft <b>Text <\/b>liefert.<\/p>\n<p>Mit der folgenden <b>Select Case<\/b>-Unterscheidung pr&uuml;fen wir, um welchen Typ es sich bei dem angeklickten Element handelt. Daher pr&uuml;fen wir hier den Wert der Variablen <b>strTyp<\/b>. Hat die Variable den Wert <b>k<\/b>, soll die Prozedur zun&auml;chst eine Meldung anzeigen, welche den Namen des Kunden ausgibt. Handelt es sich um den Wert <b>p<\/b>, wird der Name des Projekts ausgegeben (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_007.png\" alt=\"Meldungsfenster statt Kontextmen&uuml;\" width=\"424,7115\" height=\"310,5034\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Meldungsfenster statt Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Damit haben wir schon einmal die beiden F&auml;lle f&uuml;r die unterschiedlichen Elementarten abgedeckt. Was aber geschieht, wenn der Benutzer auf den leeren Bereich im <b>TreeView<\/b>-Steuerelement klickt Auch hier kann die Anzeige eines Kontextmen&uuml;s n&uuml;tzlich sein &#8211; zum Beispiel wenn Sie das Anlegen neuer Elemente der obersten Ebene des <b>TreeView<\/b>-Steuerelements &uuml;ber das Kontextmen&uuml; erlauben wollen.<\/p>\n<p>Dieser Fall tritt auf, wenn <b>objNode <\/b>nach dem Auswerten von <b>HitTest <\/b>kein Element enth&auml;lt. Wir k&ouml;nnen dann also davon ausgehen, dass der Benutzer in den leeren Bereich des <b>TreeView<\/b>-Steuerelements geklickt hat.<\/p>\n<p>In diesem Fall k&ouml;nnen wir einfach den <b>Else<\/b>-Zweig nutzen, um das gew&uuml;nschte Kontextmen&uuml; anzuzeigen.<\/p>\n<p><b>Kontextmen&uuml; anzeigen<\/b><\/p>\n<p>Nun m&uuml;ssen wir noch die Anweisungen, die bisher bei Rechtsklick auf das <b>TreeView<\/b>-Steuerelement eine Meldung angezeigt haben, durch Anweisungen zur Anzeige von Kontextmen&uuml;s ersetzen.<\/p>\n<p>Um ein Kontextmen&uuml; anzuzeigen, m&uuml;ssen wir dieses zun&auml;chst zusammenstellen. Dazu ben&ouml;tigen wir einen Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library<\/b>. Diesen f&uuml;gen Sie &uuml;ber den <b>Verweise<\/b>-Dialog hinzu (VBA-Editor, Men&uuml;eintrag <b>Extras|Verweise<\/b>) &#8211; siehe Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_008.png\" alt=\"Verweis auf die Bibliothek Microsoft Office x.0 Object Library\" width=\"424,7115\" height=\"334,8159\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Verweis auf die Bibliothek Microsoft Office x.0 Object Library<\/span><\/b><\/p>\n<p>Danach programmieren wir die Funktion f&uuml;r die Anzeige eines Kontextmen&uuml;s f&uuml;r ein Kundenelement im <b>TreeView<\/b>-Steuerelement. Die Funktion hei&szlig;t <b>KontextmenueKunden <\/b>und erwartet zwei Parameter:<\/p>\n<ul>\n<li><b>lngID<\/b>: Prim&auml;rschl&uuml;sselwert des anzuzeigenden Elements<\/li>\n<li><b>strText<\/b>: Text, der im Eintrag angezeigt werden soll<\/li>\n<\/ul>\n<p>Die Funktion finden Sie in Listing 3. Sie deklariert die Variable <b>cbr <\/b>f&uuml;r das <b>CommandBar<\/b>-Objekt, also f&uuml;r das Men&uuml; selbst. Die Variable <b>cbc <\/b>nimmt einen Verweis auf die zu erstellende Schaltfl&auml;che im Men&uuml; auf. Mit <b>objPicture <\/b>referenzieren wir ein <b>StdPicture<\/b>-Objekt, welches das Bild zur Anzeige im Kontextmen&uuml; enth&auml;lt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KontextmenueKunden(lngID<span style=\"color:blue;\"> As Long<\/span>, strText<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>Office.CommandBarButton\r\n     <span style=\"color:blue;\">Dim <\/span>objPicture<span style=\"color:blue;\"> As <\/span>StdPicture\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     CommandBars(\"TreeView_Kunden\").Delete\r\n     <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Add(\"TreeView_Kunden\", msoBarPopup, False, <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbr\r\n         <span style=\"color:blue;\">Set<\/span> cbc = .Controls.Add(msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"Kunde l&ouml;schen\"\r\n             .OnAction = \"=KundeLoeschen(\" & lngID & \")\"\r\n             <span style=\"color:blue;\">Set<\/span> objPicture = ResourceToPicture(\"user_16_delete\")\r\n             .Picture = objPicture\r\n             .Mask = MaskFromPicture(objPicture)\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         .ShowPopup\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Anzeigen eines ersten Kontetxmen&uuml;s<\/span><\/b><\/p>\n<p>Das neue Kontextmen&uuml; soll <b>TreeView_Kunden <\/b>hei&szlig;en. Da es immer wieder neu erstellt werden muss, kann es sein, dass noch die zuvor erstellte Version existiert. Diese l&ouml;schen wir mit der <b>Delete<\/b>-Methode des Elements der Auflistung <b>CommandBars <\/b>mit diesem Namen. Da ein Fehler auftritt, wenn das <b>CommandBar<\/b>-Objekt nicht vorhanden ist, deaktivieren wir zuvor mit <b>On Error Resume Next <\/b>die Fehlerbehandlung.<\/p>\n<p>Nun erstellen wir mit der Add-Methode der gleichen Auflistung das neue Kontextmen&uuml;. Der <b>Add<\/b>-Methode &uuml;bergeben wir als Parameter den Namen des zu erstellenden Men&uuml;s und den Wert <b>msoBarPopup <\/b>daf&uuml;r, dass es als Kontextmen&uuml; erstellt wird.<\/p>\n<p>Der dritte Parameter gibt an, dass wir kein Hauptmen&uuml; erzeugen wollen und der vierte, dass das Men&uuml; tempor&auml;r erstellt werden soll. Damit wird dieses nach dem Schlie&szlig;en der Anwendung wieder gel&ouml;scht.<\/p>\n<p>Danach f&uuml;gen wir dem mit <b>cbr <\/b>referenzierten Kontextmen&uuml; eine neue Schaltfl&auml;che hinzu. Dazu nutzen wir die <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung des <b>CommandBar<\/b>-Objekts. Dieser &uuml;bergeben wir den Wert <b>msoControlButton <\/b>daf&uuml;r, dass ein Steuer-element dieses Typs hinzugef&uuml;gt wird.<\/p>\n<p>F&uuml;r das mit der Variablen <b>cbc <\/b>referenzierte neue Element stellen wir dann noch einige Eigenschaften ein:<\/p>\n<ul>\n<li><b>Caption <\/b>gibt die Beschriftung des Kontextmen&uuml;-Eintrags an, hier <b>Kunde l&ouml;schen<\/b>.<\/li>\n<li><b>OnAction <\/b>legt die Funktion fest, die bei Bet&auml;tigung dieses Kontextmen&uuml;-Eintrags ausgef&uuml;hrt werden soll. Hier erg&auml;nzen wir den Funktionsaufruf um den Wert des Parameters <b>lngID<\/b>, der den Prim&auml;rschl&uuml;sselwert des zu l&ouml;schenden Kunden liefert.<\/li>\n<li><b>Picture <\/b>nimmt das Icon entgegen, das f&uuml;r den Kontextmen&uuml;-Eintrag angezeigt werden soll. Dieses befindet sich in der Variablen <b>objPicture<\/b>, die wir zuvor mit der Funktion <b>ResourceToPicture <\/b>f&uuml;llen &#8211; diese finden Sie im Modul <b>mdlOGL0710<\/b>, das wir in diesem Beitrag nicht weiter erl&auml;utern.<\/li>\n<li><b>Mask <\/b>nimmt ein Bildobjekt entgegen, das wir mit der Funktion <b>MaskFromPicture <\/b>ermitteln. Men&uuml;eintr&auml;ge k&ouml;nnen nicht automatisch mit Transparenz-Anteilen in Bilddateien umgehen. Daher m&uuml;ssen wir mit der <b>MaskFromPicture<\/b>-Funktion die transparenten Pixel der Bilddatei ermitteln und diese als Schwarz-Wei&szlig;-Bild an die Eigenschaft <b>Mask <\/b>&uuml;bergeben.<\/li>\n<\/ul>\n<p>Nachdem wir das Kontextmen&uuml; mit seiner bisher einzigen Schaltfl&auml;che fertiggestellt haben, wollen wir es auch noch anzeigen. Dazu nutzen wir die Methode <b>ShowPopup <\/b>des <b>CommandBar<\/b>-Objekts aus der Variablen <b>cbr<\/b>.<\/p>\n<p>Das Ergebnis sieht schlie&szlig;lich wie in Bild 9 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_009.png\" alt=\"Erstes Kontextmen&uuml; mit einem Befehl\" width=\"424,7115\" height=\"391,4008\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erstes Kontextmen&uuml; mit einem Befehl<\/span><\/b><\/p>\n<p><b>Funktion der Schaltfl&auml;che<\/b><\/p>\n<p>Nat&uuml;rlich soll ein Klick auf die Kontextmen&uuml;-Schaltfl&auml;che auch noch etwas bewirken &#8211; in diesem Fall das L&ouml;schen eines Kundendatensatzes. Wir wollen diese Aktion selbst nicht zu Ende programmieren, sondern zeigen nur eine entsprechende Meldung an &#8211; es geht schlie&szlig;lich nur darum zu zeigen, wie die aufgerufene Funktion aussehen muss.<\/p>\n<p>Dazu legen wir die folgende Funktion in einem Standardmodul an:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>KundeLoeschen(lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Kunde mit der ID \" & lngID & \" wird gel&ouml;scht.\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion hei&szlig;t also genau so wie f&uuml;r die Eigenschaft <b>OnAction <\/b>angegeben. Au&szlig;erdem muss Sie den &uuml;bergebenen Parameter entgegennehmen. Die Funktion zeigt wie in Bild 10 eine Meldung an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_010.png\" alt=\"Per Kontextmen&uuml; angezeigte Meldung\" width=\"424,7115\" height=\"310,5034\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Per Kontextmen&uuml; angezeigte Meldung<\/span><\/b><\/p>\n<p>Die <b>MsgBox<\/b>-Anweisung k&ouml;nnen Sie noch durch Anweisungen ersetzen, welche die tats&auml;chliche Aufgabe der Kontextmen&uuml;-Schaltfl&auml;che erledigen.<\/p>\n<p><b>Weitere Schaltfl&auml;chen zum Kontextmen&uuml; hinzuf&uuml;gen<\/b><\/p>\n<p>Wenn Sie nicht nur eine Schaltfl&auml;che ben&ouml;tigen, sondern mehrere, dann k&ouml;nnen Sie ganz einfach den Codeblock zum Anlegen einer Schaltfl&auml;che kopieren, hinter den bestehenden Codeblock einf&uuml;gen und die notwendigen Einstellungen wie Beschriftung, auszuf&uuml;hrender Befehl und Bilder anpassen.<\/p>\n<p>Wenn Sie einige Schaltfl&auml;chen hinzuf&uuml;gen m&ouml;chten, wird das allerdings schnell un&uuml;bersichtlich und fehleranf&auml;llig.<\/p>\n<p>Also nehmen wir eine kleine Vereinfachung vor, indem wir diese Befehle in eine eigene Routine auslagern, die wir dann von der eigentlichen Prozedur aus f&uuml;r jede Schaltfl&auml;che aufrufen.<\/p>\n<p>Diese Routine finden Sie in Listing 4. Sie erwartet folgende Parameter:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AddCommandBarButton(cbr<span style=\"color:blue;\"> As <\/span>CommandBar, strCaption<span style=\"color:blue;\"> As String<\/span>, strOnAction<span style=\"color:blue;\"> As String<\/span>, strPicture<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> bolSeparator<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Dim <\/span>objPicture<span style=\"color:blue;\"> As <\/span>StdPicture\r\n     <span style=\"color:blue;\">Set<\/span> cbc = cbr.Controls.Add(msoControlButton)\r\n     <span style=\"color:blue;\">With<\/span> cbc\r\n         .Caption = strCaption\r\n         .OnAction = strOnAction\r\n         <span style=\"color:blue;\">Set<\/span> objPicture = ResourceToPicture(strPicture)\r\n         .Picture = objPicture\r\n         .Mask = MaskFromPicture(objPicture)\r\n         <span style=\"color:blue;\">If <\/span>bolSeparator = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Hinzuf&uuml;gen einer Schaltfl&auml;che zu einem Kontextmen&uuml;<\/span><\/b><\/p>\n<ul>\n<li><b>cbr<\/b>: Verweis auf das Kontextmen&uuml;, dem die Schaltfl&auml;che hinzugef&uuml;gt werden soll<\/li>\n<li><b>strCaption<\/b>: Beschriftung der Schaltfl&auml;che<\/li>\n<li><b>strOnAction<\/b>: Funktion, die nach dem Anklicken der Schaltfl&auml;che aufgerufen werden soll<\/li>\n<li><b>strPicture<\/b>: Bild, das mit der Schaltfl&auml;che angezeigt werden soll<\/li>\n<li><b>bolSeparator<\/b>: Gibt an, ob vor der Schaltfl&auml;che ein Trennstrich eingef&uuml;gt werden soll.<\/li>\n<\/ul>\n<p>Die Routine &uuml;bernimmt die gleichen Funktionen, die wir zuvor in dem entsprechenden Block in der Prozedur <b>KontextmenueKunden <\/b>erledigt haben &#8211; nur dass wir diese Anweisungen nun nur noch einmal anzulegen brauchen. Zus&auml;tzlich haben wir noch die Option eingebaut, vor einem Kontextmen&uuml;-Eintrag einen Trennstrich einzuf&uuml;gen. Dieser wird eingef&uuml;gt, wenn der Parameter <b>bolSeparator <\/b>den Wert <b>True <\/b>hat. Dadurch stellt die Prozedur den Wert der Eigenschaft <b>BeginGroup <\/b>auf <b>True <\/b>ein.<\/p>\n<p>Wieviel Code wir dadurch in der eigentlichen Prozedur einsparen, sehen wir in Listing 5. Hier ben&ouml;tigen wir f&uuml;r jede anzulegende Schaltfl&auml;che nur noch jeweils einen Aufruf der Prozedur <b>AddCommandBarButton<\/b>. Dem zweiten Aufruf haben wir als letzten Parameter den Wert <b>True <\/b>hinzugef&uuml;gt, damit eine Trennlinie vor diesem Element eingef&uuml;gt wird. Das Ergebnis sieht wie in Bild 11 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_011.png\" alt=\"Kontextmen&uuml; mit zwei Eintr&auml;gen\" width=\"424,7115\" height=\"265,296\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Kontextmen&uuml; mit zwei Eintr&auml;gen<\/span><\/b><\/p>\n<p><b>Bilder speichern<\/b><\/p>\n<p>Wenn Sie wie im Beispiel Bilder im Kontextmen&uuml; anzeigen wollen, brauchen Sie nur zwei Schritte durchzuf&uuml;hren:<\/p>\n<ul>\n<li>Bilder in die Tabelle <b>MSysResources <\/b>bringen<\/li>\n<li>Bilder als Parameter an die Funktion zum Erstellen eines Eintrags &uuml;bergeben<\/li>\n<\/ul>\n<p>F&uuml;r den ersten Schritt gibt es mehrere M&ouml;glichkeiten. Der einfachste ist der &uuml;ber den Entwurf eines Formulars. Sie k&ouml;nnen ein neues oder ein beliebiges existierendes Formular &ouml;ffnen und f&uuml;r dieses den Ribbonbefehl <b>Entwurf|Steuerelemente|Bild einf&uuml;gen <\/b>aufrufen. Dies zeigt einen Dialog an, mit dem Sie die Bilddatei ausw&auml;hlen k&ouml;nnen. Nach dem Schlie&szlig;en des Dialogs zeigt Access beim &Uuml;berfahren des Formularentwurfs als Mauszeiger ein Symbol zum Einf&uuml;gen eines Bild-Steuerelements an. Da wir das Bild gar nicht zum Formular hinzuf&uuml;gen wollen, brechen wir den Vorgang an dieser Stelle mit der <b>Escape<\/b>-Taste ab. Die Bilddatei wurde allerdings dennoch zur Tabelle <b>MSysResources <\/b>hinzugef&uuml;gt. Die dort gespeicherten Bilddateien k&ouml;nnen Sie anzeigen, indem Sie erneut auf die Schaltfl&auml;che <b>Bild einf&uuml;gen <\/b>klicken (siehe Bild 12). Die hier angegebenen Beschriftungen geben Sie dann f&uuml;r den vierten Parameter der Prozedur <b>AddCommandButton <\/b>an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1243_012.png\" alt=\"Betrachten verf&uuml;gbarer Bilddateien\" width=\"424,7115\" height=\"252,2961\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Betrachten verf&uuml;gbarer Bilddateien<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag zeigt, wie Sie Kontextmen&uuml;-Eintr&auml;ge f&uuml;r die Elemente eines <b>TreeView<\/b>-Steuerelements anzeigen lassen k&ouml;nnen. Die Programmierung der Funktionen dieser Kontextmen&uuml;-Befehle ist noch ein anderes Thema &#8211; immerhin werden dort nicht nur Daten-Operationen ausgef&uuml;hrt wie die folgenden:<\/p>\n<ul>\n<li>neuen Kunden anlegen, <\/li>\n<li>Kunden l&ouml;schen,<\/li>\n<li>neues Projekt anlegen oder <\/li>\n<li>Projekt l&ouml;schen.<\/li>\n<\/ul>\n<p>Die Daten-Operationen sind leicht zu programmieren. Wesentlich aufwendiger ist das Aktualisieren des <b>TreeView<\/b>-Steuerelements nach dem &Auml;ndern der Daten. Gel&ouml;schte Elemente m&uuml;ssen aus dem TreeView entfernt werden, neue Elemente hinzugef&uuml;gt. Das kann man auf zwei Arten erledigen:<\/p>\n<ul>\n<li>Sie leeren das <b>TreeView<\/b>-Steuerelement und f&uuml;llen es komplett neu.<\/li>\n<li>Sie legen Elemente gezielt neu an oder entfernen diese aus dem <b>TreeView<\/b>-Steuerelement.<\/li>\n<\/ul>\n<p>Hinzu kommt noch, dass beim Anklicken von Elementen im TreeView-Steuerelement in der Regel auch die entsprechenden Detaildaten in Unterformularen neben dem TreeView-Steuerelement angezeigt werden sollen.<\/p>\n<p>Au&szlig;erdem, und das ist ebenfalls eine Herausforderung: Wenn Sie einen neuen Eintrag anlegen, beispielsweise einen Kunden, haben Sie zun&auml;chst noch keine Bezeichnung f&uuml;r diesen neuen Datensatz. Wie wollen Sie daf&uuml;r dann einen neuen Eintrag im <b>TreeView<\/b>-Steuerelement anlegen Sie k&ouml;nnten dann zwei Dinge tun:<\/p>\n<ul>\n<li>Die Bezeichnung vorab per InputBox abfragen und diese dann gleichzeitig in einem neuen Datensatz speichern und im <b>TreeView<\/b>-Steuerelement als neuen Eintrag hinzuf&uuml;gen oder<\/li>\n<li>den Benutzer den neuen Eintrag im Unterformular anlegen lassen und erst nach dem Speichern des neuen Eintrags den neuen Kunden im <b>TreeView<\/b>-Steuerelement anzeigen.<\/li>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TreeViewMitKontextmenue.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/9C8E56EA-289D-49E6-9EC6-5C7DDB422827\/aiu_1243.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TreeViews sind sehr flexible Steuer-elemente, die sich vor allem zur Darstellung von Daten in hierarchischen Strukturen etabliert haben. Sie bieten viele verschiedene M&ouml;glichkeiten zur Visualisierung von Daten. Au&szlig;erdem lassen sich die g&auml;ngigen Ereignisse f&uuml;r die Elemente des TreeView-Steuerelements abbilden &#8211; zum Beispiel Mausklicks, Drag and Drop und so weiter. Leider bietet das TreeView-Steuerelement keine eingebaute M&ouml;glichkeit, wie bei den Standard-Steuerelementen Kontextmen&uuml;s anzuzeigen. Daher schauen wir uns in diesem Beitrag an, wie Sie ein TreeView-Steuerelement um Kontextmen&uuml;-Funktionen erweitern und welche Strategien dabei wichtig sind.<\/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":[662020,66042020,44000023],"tags":[],"class_list":["post-55001243","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Mit_Formularen_arbeiten"],"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>TreeView mit Kontextmen&uuml; - 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\/TreeView_mit_Kontextmenue\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TreeView mit Kontextmen&uuml;\" \/>\n<meta property=\"og:description\" content=\"TreeViews sind sehr flexible Steuer-elemente, die sich vor allem zur Darstellung von Daten in hierarchischen Strukturen etabliert haben. Sie bieten viele verschiedene M&ouml;glichkeiten zur Visualisierung von Daten. Au&szlig;erdem lassen sich die g&auml;ngigen Ereignisse f&uuml;r die Elemente des TreeView-Steuerelements abbilden - zum Beispiel Mausklicks, Drag and Drop und so weiter. Leider bietet das TreeView-Steuerelement keine eingebaute M&ouml;glichkeit, wie bei den Standard-Steuerelementen Kontextmen&uuml;s anzuzeigen. Daher schauen wir uns in diesem Beitrag an, wie Sie ein TreeView-Steuerelement um Kontextmen&uuml;-Funktionen erweitern und welche Strategien dabei wichtig sind.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-05T10:25:21+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"TreeView mit Kontextmen&uuml;\",\"datePublished\":\"2020-08-05T10:25:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/\"},\"wordCount\":3465,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/b011f8c9a07c4dfea5c7587648384cb1\",\"articleSection\":[\"2020\",\"4\\\/2020\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/\",\"name\":\"TreeView mit Kontextmen&uuml; - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/b011f8c9a07c4dfea5c7587648384cb1\",\"datePublished\":\"2020-08-05T10:25:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/b011f8c9a07c4dfea5c7587648384cb1\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/b011f8c9a07c4dfea5c7587648384cb1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_mit_Kontextmenue\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TreeView mit Kontextmen&uuml;\"}]},{\"@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 mit Kontextmen&uuml; - 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\/TreeView_mit_Kontextmenue\/","og_locale":"de_DE","og_type":"article","og_title":"TreeView mit Kontextmen&uuml;","og_description":"TreeViews sind sehr flexible Steuer-elemente, die sich vor allem zur Darstellung von Daten in hierarchischen Strukturen etabliert haben. Sie bieten viele verschiedene M&ouml;glichkeiten zur Visualisierung von Daten. Au&szlig;erdem lassen sich die g&auml;ngigen Ereignisse f&uuml;r die Elemente des TreeView-Steuerelements abbilden - zum Beispiel Mausklicks, Drag and Drop und so weiter. Leider bietet das TreeView-Steuerelement keine eingebaute M&ouml;glichkeit, wie bei den Standard-Steuerelementen Kontextmen&uuml;s anzuzeigen. Daher schauen wir uns in diesem Beitrag an, wie Sie ein TreeView-Steuerelement um Kontextmen&uuml;-Funktionen erweitern und welche Strategien dabei wichtig sind.","og_url":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-08-05T10:25:21+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"TreeView mit Kontextmen&uuml;","datePublished":"2020-08-05T10:25:21+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/"},"wordCount":3465,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1","articleSection":["2020","4\/2020","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/","url":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/","name":"TreeView mit Kontextmen&uuml; - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1","datePublished":"2020-08-05T10:25:21+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/b011f8c9a07c4dfea5c7587648384cb1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/TreeView_mit_Kontextmenue\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"TreeView mit Kontextmen&uuml;"}]},{"@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\/55001243","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=55001243"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001243\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}