{"id":55000919,"date":"2014-02-01T00:00:00","date_gmt":"2020-05-22T21:18:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=919"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"TreeView_Neue_Elemente_anlegen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/","title":{"rendered":"TreeView: Neue Elemente anlegen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das Anlegen neuer Elemente in einem TreeView-Steuerelement, das die Daten aus ein oder mehreren Tabellen anzeigt, ist nicht immer trivial. Soll das Anlegen &uuml;ber ein Detailformular erfolgen und der Eintrag dann zum TreeView hinzugef&uuml;gt werden Oder reicht vielleicht die Bezeichnung des neuen Elements zun&auml;chst aus, um dieses zum TreeView hinzuzuf&uuml;gen &#8211; dann w&auml;re eine InputBox oder die direkte Angabe im TreeView eine L&ouml;sung. Dieser Beitrag zeigt verschiedene M&ouml;glichkeiten, um neue Elemente anzulegen.<\/b><\/p>\n<p><b>Varianten<\/b><\/p>\n<p>Wer ein <b>TreeView<\/b>-Steuerelement einsetzt, beabsichtigt zun&auml;chst die Anzeige hierarchischer Daten in &uuml;bersichtlicher Form.<\/p>\n<p>Gelegentlich kommt der Wunsch hinzu, die Daten direkt &uuml;ber das <b>TreeView<\/b>-Steuerelement zu bearbeiten oder zumindest von dort aus die zur Bearbeitung notwendigen Formulare zu &ouml;ffnen beziehungsweise Unterformulare mit den entsprechenden Daten zu f&uuml;llen. In diesem Beitrag schauen wir uns an, wie Sie neue Elemente zu den verschiedenen <b>TreeView<\/b>-Steuerelementen hinzuf&uuml;gen. Dabei gibt es im Wesentlichen die folgenden Varianten:<\/p>\n<ul>\n<li>Die Elemente sollen nur im <b>TreeView<\/b>-Steuerelement angezeigt werden. In diesem Fall reicht es, ein neues Element hinzuzuf&uuml;gen und dem Benutzer die M&ouml;glichkeit zu bieten, die Beschriftung anzupassen. &auml;nderungen an den Daten des neu hinzugef&uuml;gten Datensatzes kann er sp&auml;ter vornehmen.<\/li>\n<li>Diese Variante k&ouml;nnen Sie auch mithilfe einer <b>InputBox <\/b>unterst&uuml;tzen. Beim Anlegen eines neuen Eintrags zeigen Sie dabei eine <b>InputBox <\/b>zum Erfassen der Bezeichnung des Elements an und f&uuml;gen das neue Element dann gleich unter Angabe der Bezeichnung zum <b>TreeView<\/b>-Steuerelement hinzu.<\/li>\n<li>Die Daten sind komplexer, das hei&szlig;t, dass etwa die im <b>TreeView<\/b>-Steuer-element angezeigte Bezeichnung sich aus den Daten mehrerer Felder zusammensetzt. In diesem Fall muss zwingend ein Formular ge&ouml;ffnet werden, um den dem neuen <b>TreeView<\/b>-Element zugrunde liegenden Datensatz anzulegen. Erst dann kann die Beschriftung f&uuml;r den Eintrag im <b>TreeView<\/b>-Steuerelement aktualisiert werden.<\/li>\n<\/ul>\n<p>Letztere Variante kann beispielsweise in den folgenden beiden Auspr&auml;gungen auftauchen:<\/p>\n<ul>\n<li>Das Formular mit dem <b>TreeView<\/b>-Steuerelement zeigt in einem Unterformular jeweils die Daten des aktuell im <b>TreeView<\/b>-Steuerelement markierten Elements an.<\/li>\n<li>Die Eintr&auml;ge im <b>TreeView<\/b>-Element werden jeweils in eigens dazu ge&ouml;ffneten Formularen angezeigt &#8211; etwa per Mausklick, Doppelklick, Kontextmen&uuml; oder Schaltfl&auml;che.<\/li>\n<\/ul>\n<p>Der Fall mit dem Unterformular ist einigerma&szlig;en kompliziert, denn: Was soll beim Anlegen eines neuen Datensatzes zuerst geschehen &#8211; soll erst ein neues Element im <b>TreeView<\/b>-Steuerelement angelegt werden oder erst ein neuer Datensatz Und wann und wie werden die &auml;nderungen im Datensatz in das <b>TreeView<\/b>-Steuerelement &uuml;bertragen Diese und andere Fragen beantworten wir auf den folgenden Seiten.<\/p>\n<p><b>Speichern der Daten<\/b><\/p>\n<p>Eines haben alle Varianten gemeinsam: Es soll immer ein Datensatz zu der Tabelle hinzugef&uuml;gt werden, welche die Elemente der aktuellen Ebene des <b>TreeView<\/b>-Steuerelements liefert (wobei eine Ebene nat&uuml;rlich auch Elemente aus verschiedenen Tabellen enthalten kann). Gleichzeitig soll ein neuer Eintrag zum <b>TreeView<\/b>-Steuerelement hinzugef&uuml;gt werden.<\/p>\n<p><b>Ausl&ouml;sen des Anlegevorgangs<\/b><\/p>\n<p>Einen neuen Eintrag k&ouml;nnen Sie auf verschiedene Arten zum <b>TreeView<\/b>-Steuerelement hinzuf&uuml;gen. Die komfortabelste M&ouml;glichkeit ist sicher der Einsatz von Kontextmen&uuml;s, da diese immer nur die f&uuml;r das jeweilige Element verf&uuml;gbaren Befehle anzeigen.<\/p>\n<p>Wenn das <b>TreeView<\/b>-Steuerelement nur Daten aus einer reflexiv verkn&uuml;pften Tabelle anzeigt, reicht sicher auch eine Schaltfl&auml;che au&szlig;erhalb des <b>TreeView<\/b>-Steuerelements aus, um ein neues Element zum aktuell markierten Element hinzuzuf&uuml;gen.<\/p>\n<p>Beim Hinzuf&uuml;gen eines Elements muss aber in jedem Fall feststehen, unterhalb welches anderen Elements das neue Element angelegt werden soll &#8211; oder ob dieses als neues Root-Element ohne &uuml;bergeordnetes Element zu erstellen ist.<\/p>\n<p>Bei <b>TreeView<\/b>-Steuerelementen, die Daten aus mehreren hierarchisch verkn&uuml;pften Tabellen anzeigen, m&uuml;ssen Sie au&szlig;erdem wissen, zu welcher Tabelle das neue Element hinzugef&uuml;gt werden soll.<\/p>\n<p>Dies ergibt sich aber in der Regel aus dem Aufbau der Tabellen und geschieht somit in Abh&auml;ngigkeit vom &uuml;bergeordneten Element. Interessant wird dies, wenn Sie ein <b>TreeView<\/b>-Steuerelement mit den Daten aus Tabellen mit gemischten Beziehungen f&uuml;llen &#8211; also sowohl aus reflexiv verkn&uuml;pften Tabellen als auch aus anderen hierarchisch verkn&uuml;pften Tabellen. Dies ist beispielsweise der Fall, wenn Sie Verzeichnisse und Dateien abbilden. Jedes Verzeichnis kann Verzeichnisse und Dateien enthalten, also m&uuml;ssen Sie f&uuml;r jedes Verzeichnis auch Befehle zum Hinzuf&uuml;gen von Verzeichnissen und Dateien bereitstellen.<\/p>\n<p><b>Beispiel St&uuml;ckliste<\/b><\/p>\n<p>Ein Beispiel, dass sowohl reflexiv verkn&uuml;pfte Elemente als auch 1:n-Verkn&uuml;pfungen enth&auml;lt, ist die St&uuml;ckliste. Der Beitrag <b>St&uuml;cklisten <\/b>(<b>www.access-im-unternehmen.de\/923<\/b>) liefert das Beispiel f&uuml;r den vorliegenden Beitrag. Dort finden Sie Baugruppen, die aus weiteren Baugruppen oder aus Einzelteilen bestehen k&ouml;nnen. Ein Einzelteil hingegen ist eine atomare Einheit und kann nicht in weitere Elemente aufgeteilt werden.<\/p>\n<p>Dieses Beispiel enth&auml;lt sowohl Daten aus einer Tabelle, die prinzipiell nur die Bezeichnung der Elemente speichert (Baugruppen) also auch solche, die mehrere Attribute erfordern (Einzelteile). Wir k&ouml;nnen uns im Rahmen dieses Beitrags also an diesem Beispiel austoben.<\/p>\n<p>Wichtig ist an dieser Stelle, dass das <b>TreeView<\/b>-Steuerelement mit einer Variablen namens <b>objTreeView <\/b>referenziert wird, die gleich beim Laden des Formulars gef&uuml;llt wird. Daher k&ouml;nnen wir in den folgenden Beispielprozeduren jeweils direkt auf <b>objTreeview <\/b>zugreifen und auch f&uuml;r dieses Objekt die ben&ouml;tigten Ereignisprozeduren implementieren.<\/p>\n<p><b>Einfache Elemente hinzuf&uuml;gen<\/b><\/p>\n<p>Wie oben erl&auml;utert, ist der einfachste Fall f&uuml;r das Hinzuf&uuml;gen von Elementen zu einem <b>TreeView<\/b>-Steuerelement der, bei dem im ersten Schritt allein die Bezeichnung des jeweiligen Elements angegeben und dann sowohl in einem neuen Element im <b>TreeView<\/b>-Steuerelement angezeigt als auch in der zugrunde liegenden Tabelle gespeichert wird. Im Beispiel handelt es sich dabei um die Baugruppen. Wir schauen uns zwei Methoden an &#8211; die mit der <b>InputBox <\/b>und die mit dem direkten Anlegen im <b>TreeView<\/b>-Steuerelement.<\/p>\n<p><b>Element per InputBox hinzuf&uuml;gen<\/b><\/p>\n<p>Um Elemente einfach hinzuzuf&uuml;gen, haben wir einige Schaltffl&auml;chen im oberen Bereich des Beispielformulars mit dem <b>TreeView<\/b>-Steuerelement untergebracht (s. Bild 1). Wie das <b>TreeView<\/b>-Steuerelement gef&uuml;llt wird, erfahren Sie im oben bereits erw&auml;hnten Beitrag <b>St&uuml;cklisten<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_919_001.png\" alt=\"Schaltfl&auml;chen zum Anlegen neuer Elemente\" width=\"450\" height=\"206,1787\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Schaltfl&auml;chen zum Anlegen neuer Elemente<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdNeueBaugruppeI<\/b> soll eine <b>InputBox <\/b>anzeigen, welche die Bezeichnung der neuen Baugruppe abfragt. Anschlie&szlig;end soll der Eintrag an der gew&uuml;nschten Stelle im <b>TreeView<\/b>-Steuerelement angelegt und in der Datenbank gespeichert werden.<\/p>\n<p>Die Prozedur, die durch das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che ausgel&ouml;st wird, finden Sie in Listing 1. Die Prozedur speichert zun&auml;chst einen mit der Eigenschaft <b>SelectedItem <\/b>ermittelten Verweis auf das aktuell markierte Element im <b>TreeView<\/b>-Steuerelement in der Variablen <b>objNode<\/b>. Sie ermittelt den <b>Key<\/b>-Wert des Elements und speichert diesen in der Variablen <b>strKey<\/b>. Nun ben&ouml;tigen wir ein paar Informationen, die sich in der <b>Key<\/b>-Eigenschaft befinden. Der Inhalt von <b>Key <\/b>ist normalerweise auf eine von zwei Arten aufgebaut:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueBaugruppeI_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>objNodeNeu<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/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>lngNeuID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.SelectedItem\r\n     strKey = objNode.Key\r\n     KeyParsen strKey, strTyp, lngID\r\n     strBezeichnung = InputBox(\"Geben Sie die Bezeichnung der neuen Baugruppe an.\", _\r\n         \"Neue Baugruppe\", \"[Neue Baugruppe]\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBezeichnung) &gt; 0 And <span style=\"color:blue;\">Not<\/span> strBezeichnung = \"[Neue Baugruppe]\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         Select Case strTyp\r\n             <span style=\"color:blue;\">Case <\/span>\"r\"\r\n                 db.Execute \"INSERT INTO tblBaugruppen(Baugruppe, IstProdukt) VALUES(''\" _\r\n                     & strBezeichnung & \"'', -1)\", dbFailOnError\r\n                 lngNeuID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n                 <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, objNode.Key _\r\n                     & \"|p\" & lngNeuID, strBezeichnung, \"elements_hierarchy\")\r\n             <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n                 db.Execute \"INSERT INTO tblBaugruppen(Baugruppe, IstProdukt) VALUES(''\" _\r\n                     & strBezeichnung & \"'', 0)\", dbFailOnError\r\n                 lngNeuID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n                 db.Execute \"INSERT INTO tblBaugruppenzuordnungen(BaugruppeVaterID, &quot; _\r\n                     &amp; &quot;BaugruppeKindID) VALUES(\" & lngID & \", \" _\r\n                     & lngNeuID & \")\", dbFailOnError\r\n                 <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, objNode.Key _\r\n                     & \"|p\" & lngNeuID, strBezeichnung, \"gearwheels\")\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         objNode.Expanded = <span style=\"color:blue;\">True<\/span>\r\n         objTreeView.SelectedItem = objNodeNeu\r\n         Me!ctlTreeView.SetFocus\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anlegen eines neuen TreeView-Elements per InputBox<\/span><\/b><\/p>\n<ul>\n<li>Buchstabe, der die Art des Elements charakterisiert (in diesem Beispiel <b>r <\/b>f&uuml;r Root, <b>p <\/b>f&uuml;r Produkt, <b>b <\/b>f&uuml;r Baugruppe oder <b>e <\/b>f&uuml;r Einzelteil)<\/li>\n<li>Zahl, die den Wert des Prim&auml;rschl&uuml;sselfeldes des Datensatzes enth&auml;lt, den das Element repr&auml;sentiert<\/li>\n<\/ul>\n<p>Der Key k&ouml;nnte also etwa <b>r0<\/b>, <b>p123 <\/b>oder <b>b13 <\/b>lauten. Im vorliegenden Fall haben wir es allerdings mit einem <b>TreeView<\/b>-Steuerelement zu tun, das Daten aus einer reflexiven Beziehung enth&auml;lt. Ein Element, etwa eine Baugruppe oder ein Einzelteil, k&ouml;nnte also mehrfach im <b>TreeView<\/b>-Steuerelement vorkommen. Jeder <b>Key <\/b>darf aber nur einmal vorkommen, sodass wir die Eindeutigkeit anderweitig sicherstellen m&uuml;ssen. In diesem Fall besteht der <b>Key<\/b>-Wert aus einer Abfolge aller <b>Key<\/b>-Werte in der Hierarchie vom Root-Element bis zum aktuellen Element, und zwar getrennt durch ein spezielles Zeichen wie etwa das Pipe-Zeichen: <b>r0|p1|b2|b27|e12<\/b>.<\/p>\n<p>Um aus einem solchen Ausdruck den kennzeichnenden Buchstaben f&uuml;r den Typ des Elements sowie den Prim&auml;rschl&uuml;sselwert zu ermitteln, haben wir eine kleine Hilfsprozedur entwickelt.<\/p>\n<p>Diese hei&szlig;t <b>KeyParsen <\/b>und sieht wie in Listing 2 aus (siehe Modul <b>mdlTools<\/b>). Die Prozedur erwartet drei Parameter. <b>strKey <\/b>&uuml;bergibt den <b>Key<\/b>-Wert und die Parameter <b>strTyp <\/b>und <b>lngID <\/b>sind R&uuml;ckgabeparameter, die in der Prozedur <b>KeyParsen <\/b>gef&uuml;llt werden.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KeyParsen(ByVal strKey<span style=\"color:blue;\"> As String<\/span>, strTyp<span style=\"color:blue;\"> As String<\/span>, lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngPosPipe<span style=\"color:blue;\"> As Long<\/span>\r\n     lngPosPipe = <span style=\"color:blue;\">InStrRev<\/span>(strKey, \"|\")\r\n     <span style=\"color:blue;\">If <\/span>lngPosPipe &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strKey = <span style=\"color:blue;\">Mid<\/span>(strKey, lngPosPipe + 1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strTyp = <span style=\"color:blue;\">Left<\/span>(strKey, 1)\r\n     lngID = <span style=\"color:blue;\">Mid<\/span>(strKey, 2)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Funktion KeyParsen<\/span><\/b><\/p>\n<p><b>KeyParsen <\/b>ermittelt zun&auml;chst mit der <b>InStrRev<\/b>-Funktion die Position des hintersten Pipe-Zeichens. Ist diese gr&ouml;&szlig;er <b>0<\/b>, schneidet die Prozedur den Teil vor diesem Trennzeichen ab, sodass <b>strKey <\/b>anschlie&szlig;end nur noch den <b>Key <\/b>des aktuellen Elements enth&auml;lt. Falls kein Pipe-Zeichen vorliegt, scheint es sich bereits um einen einfachen <b>Key<\/b>-Wert zu handeln (entweder, weil es ein Root-Element ist oder weil alle <b>Key<\/b>-Werte einfache <b>Key<\/b>-Werte sind). <b>strType<\/b> wird dann mit dem ersten Zeichen aus <b>strKey <\/b>gef&uuml;llt, <b>lngID <\/b>mit der darauf folgenden Zeichenkette (dies funktioniert nur mit <b>TreeView<\/b>-Steuerelementen, die nur einfache Buchstaben verwenden &#8211; sollten Sie mehr Buchstaben ben&ouml;tigen, m&uuml;ssen Sie den Mechanismus auf zwei oder mehr Buchstaben zu Beginn des <b>Key<\/b>-Wertes umstellen). Normalerweise sollten jedoch 26 verschiedene Typen ausreichen, was den Buchstaben des Alphabets entspricht (der <b>Key<\/b>-Wert muss immer mit einem Buchstaben beginnen).<\/p>\n<p>Die Prozedur <b>cmdNeueBaugruppeI_Click <\/b>ruft also die Routine <b>KeyParsen <\/b>auf, um <b>strTyp <\/b>und <b>lngID <\/b>einzulesen. Dann ermittelt sie per <b>InputBox <\/b>den Namen der neuen Baugruppe (s. Bild 2) und speichert das Ergebnis in der Variablen <b>strBezeichnung<\/b>. Hat der Benutzer einen Wert ungleich dem Standardwert <b>[Neue Baugruppe] <\/b>eingegeben, erfolgen die weiteren Schritte. Die Prozedur pr&uuml;ft anhand von <b>strKey <\/b>den Typ des &uuml;bergeordneten Elements. Wenn es das Root-Element ist (<b>r<\/b>), legt die Prozedur einen neuen Datensatz in der Tabelle <b>tblBaugruppen <\/b>an und stellt den Wert von <b>IstProdukt <\/b>auf <b>-1 <\/b>(<b>True<\/b>) ein. Die folgende Anweisung ermittelt den Prim&auml;rschl&uuml;sselwert des neuen Datensatzes und speichert diesen in <b>lngNeuID<\/b>. Damit kann sie nun das neue Element im <b>TreeView<\/b>-Steuer-element anlegen. Dabei verwendet sie den <b>Key <\/b>des mit <b>objNode <\/b>referenzierten Elements als Bezugspunkt und legt das neue Element als Kind-Element an. Der <b>Key <\/b>wird aus dem <b>Key <\/b>des &uuml;bergeordneten Elements, dem Pipe-Zeichen, dem Buchstaben <b>p <\/b>(f&uuml;r Produkt) und dem Prim&auml;rschl&uuml;sselwert gebildet (f&uuml;r TreeViews ohne reflexive Beziehung reichen der Buchstabe und der Prim&auml;rschl&uuml;sselwert aus). Als Bezeichnung kommt schlie&szlig;lich der per <b>InputBox <\/b>ermittelte Ausdruck zum Einsatz.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_919_002.png\" alt=\"Anlegen eines neuen Elements per InputBox\" width=\"500\" height=\"268,6956\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen eines neuen Elements per InputBox<\/span><\/b><\/p>\n<p>Sollte die Baugruppe unterhalb einer als Produkt gekennzeichneten Baugruppe oder einer einfachen Baugruppe (<b>strKey <\/b>gleich <b>p <\/b>oder <b>b<\/b>) angelegt worden sein, ist ein zus&auml;tzlicher Schritt n&ouml;tig. Zun&auml;chst legt die Prozedur wieder den Datensatz in <b>tblBaugruppen <\/b>an (diesmal mit dem Wert <b>0<\/b>\/<b>False <\/b>im Feld <b>IstProdukt<\/b>) und erstellt das Element im <b>TreeView<\/b>-Steuerelement unterhalb des aktuellen Elements. Um die Abh&auml;ngigkeit von dem &uuml;bergeordneten Element nach dem Schlie&szlig;en und erneuten &ouml;ffnen des Formulars wiederherstellen zu k&ouml;nnen, muss dieser noch in Form eines Datensatzes in der reflexiven Verkn&uuml;pfungstabelle <b>tblBaugruppenZuordnungen <\/b>gespeichert werden.<\/p>\n<p>Im Anschluss an diese Schritte stellt die Prozedur noch den Wert der Eigenschaft <b>Expanded <\/b>des &uuml;bergeordneten <b>Node<\/b>-Objekts auf <b>True <\/b>ein und klappt damit die untergeordneten Elemente aus. Das neue Element wird als aktuelles Element markiert und das <b>TreeView<\/b>-Steuerelement erh&auml;lt den Fokus, damit die Markierung des aktuellen Steuerelements gut zu erkennen ist (sonst wird dieses nur schwach grau dargestellt).<\/p>\n<p><!--30percent--><\/p>\n<p><b>Element direkt hinzuf&uuml;gen<\/b><\/p>\n<p>Alternativ zur ersten Methode k&ouml;nnen Sie auch direkt ein neues Element unterhalb des aktuell markierten Elements anlegen und dieses gleich zum Bearbeiten durch den Benutzer vorbereiten (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_919_003.png\" alt=\"Direktes Anlegen eines neuen Elements\" width=\"450\" height=\"247,2433\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Direktes Anlegen eines neuen Elements<\/span><\/b><\/p>\n<p>Die Prozedur, die durch einen Mausklick auf die Schaltfl&auml;che <b>cmdNeueBaugruppeII <\/b>ausgel&ouml;st wird, finden Sie in Ausz&uuml;gen in Listing 3. Warum in Ausz&uuml;gen Weil die Prozedur fast genauso aufgebaut ist wie die Prozedur aus dem vorherigen Beispiel.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueBaugruppeII_Click()\r\n     ...\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"r\"\r\n             db.Execute \"INSERT INTO tblBaugruppen(Baugruppe, IstProdukt) &quot; _\r\n                 &amp; &quot;VALUES(''[Neue Baugruppe]'', -1)\", dbFailOnError\r\n             ...\r\n         <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n             db.Execute \"INSERT INTO tblBaugruppen(Baugruppe, IstProdukt) &quot; _\r\n                 &amp; &quot;VALUES(''[Neue Baugruppe]'', 0)\", dbFailOnError\r\n             ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     ...\r\n     objTreeView.StartLabelEdit\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Diese Prozedur legt ein neues Node-Objekt an und bietet seine Bearbeitung an.<\/span><\/b><\/p>\n<p>Sie ermittelt die Informationen zum &uuml;bergeordneten Element, pr&uuml;ft den Typ dieses Elements und ruft dann eine von zwei m&ouml;glichen <b>INSERT INTO<\/b>-Anweisungen innerhalb einer <b>Select Case<\/b>-Bedingung auf. Dort gibt es jedoch den Unterschied, dass die Prozedur nicht zuvor die Bezeichnung des neu hinzuzuf&uuml;genden Elements abgefragt hat. Diese soll der Benutzer aber ja auch sp&auml;ter eingeben, daher verwendet die <b>INSERT INTO <\/b>zun&auml;chst den Wert <b>[Neue Baugruppe] <\/b>als Wert f&uuml;r die Bezeichnung des neuen <b>Node<\/b>-Elements.<\/p>\n<p>Nach dem Anlegen des neuen Elements und dem Erstellen des entsprechenden Datensatzes in der Tabelle <b>tblBaugruppen <\/b>(beziehungsweise in <b>tblBaugruppenZuordnungen<\/b>) markiert die Prozedur das neue Element noch durch Einstellen der Eigenschaft <b>StartLabelEdit <\/b>zum Bearbeiten.<\/p>\n<p><b>Ereignis beim &auml;ndern des neuen Eintrags<\/b><\/p>\n<p>Da der Eintrag nun hinzugef&uuml;gt und zum &auml;ndern durch den Benutzer vorbereitet wurde, braucht der Benutzer nur noch die neue Bezeichnung der Baugruppe einzuf&uuml;gen und die Eingabe zu best&auml;tigen. Durch diese Aktion allein &auml;ndert er jedoch nur den angezeigten Wert. Nach dem Schlie&szlig;en und &ouml;ffnen des Formulars zeigt dieses wieder den vorherigen Wert (hier <b>[Neue Baugruppe]<\/b>) an.<\/p>\n<p>Typischerweise wird der Benutzer den neuen Eintrag aber direkt nach dem Anlegen auch anpassen. Damit die vorgenommenen &auml;nderungen auch in der Datenbank gespeichert werden, legen Sie eine Ereignisprozedur an, die durch das Ereignis <b>AfterLabelEdit <\/b>des <b>TreeView<\/b>-Steuerelements ausgel&ouml;st wird (s. Listing 4). Die Prozedur referenziert zun&auml;chst das aktuell markierte Element im <b>TreeView<\/b>-Steuerelement mit der Variablen <b>objNode<\/b>. Dann ermittelt sie den <b>Key<\/b>-Wert und speichert diesen in der Variablen <b>strKey<\/b>. Ein Aufruf der Prozedur <b>KeyParsen <\/b>ermittelt aus dem <b>Key <\/b>den Typ des Elements sowie den Prim&auml;rschl&uuml;sselwert des betroffenen Datensatzes.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objTreeView_AfterLabelEdit(Cancel<span style=\"color:blue;\"> As Integer<\/span>, NewString<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     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/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>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.SelectedItem\r\n     strKey = objNode.Key\r\n     KeyParsen strKey, strTyp, lngID\r\n     strBezeichnung = NewString\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n             db.Execute \"UPDATE tblBaugruppen SET Baugruppe = ''\" & strBezeichnung _\r\n                 & \"'' WHERE BaugruppeID = \" & lngID, dbFailOnError\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     objNode.Expanded = <span style=\"color:blue;\">True<\/span>\r\n     objTreeView.SelectedItem = objNode\r\n     Me!ctlTreeView.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur, die nach dem &auml;ndern eines der Eintr&auml;ge im TreeView-Steuerelement ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Der Parameter <b>NewString <\/b>der Prozedur <b>objTreeView_AfterLabelEdit <\/b>liefert die durch den Benutzer eingegebene neue Bezeichnung. Hat das Element den Typ <b>p <\/b>oder <b>b<\/b>, aktualisiert die Prozedur den Wert des Feldes <b>Baugruppe <\/b>des Datensatzes mit dem Prim&auml;rschl&uuml;sselwert aus <b>lngID <\/b>mit der neu eingegebenen Bezeichnung. Anschlie&szlig;end werden eventuelle Unterelemente angezeigt, das Element markiert und der Fokus auf das <b>TreeView<\/b>-Steuerelement gelegt.<\/p>\n<p><b>Elemente mit Details anlegen<\/b><\/p>\n<p>Die Einzelteile, aus denen eine Baugruppe besteht, enthalten einige weitere Eigenschaften. Angenommen, diese werden f&uuml;r weitere Aufgaben ben&ouml;tigt, reicht es nat&uuml;rlich nicht aus, Einzelteile einfach wie bei den beiden oben erw&auml;hnten Methoden anzulegen &#8211; also nur die Bezeichnung anzugeben und den Rest irgendwann sp&auml;ter nachzutragen.<\/p>\n<p>Erfahrungsgem&auml;&szlig; geschieht dies n&auml;mlich oft nicht zeitnah, was zu einem l&uuml;ckenhaften Datenbestand f&uuml;hrt.<\/p>\n<p>Also schauen wir uns an, wie Sie solche Elemente anlegen k&ouml;nnen. Die erste Variante ist das Anzeigen eines Detailformulars zur Eingabe eines neuen Datensatzes, der erst nach der Eingabe aller notwendigen Informationen geschlossen werden kann und dann das neue Element im <b>TreeView<\/b>-Steuerelement anzeigt.<\/p>\n<p>Die zweite Variante geht davon aus, dass die Details der Elemente im <b>TreeView<\/b>-Steuerelement in einem Unterformular im gleichen Formular wie das <b>TreeView<\/b>-Steuerelement angezeigt werden.<\/p>\n<p><b>TreeView-Element per Detailformular anlegen<\/b><\/p>\n<p>Die Beispieldatenbank enth&auml;lt ein bereits vorbereitetes Formular namens <b>frmEinzelteil<\/b>. Dieses erlaubt das Anlegen eines einzelnen Datensatzes in der Tabelle <b>tblEinzelteile<\/b>. Das Formular besitzt eine Schaltfl&auml;che namens <b>cmdOK<\/b>, welche das Formular unsichtbar macht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmd-Neues-EinzelteilI <\/b>des Formulars <b>frmStueck-listeTreeView<\/b> l&ouml;st die Prozedur aus Listing 5 aus. Diese referenziert wieder das aktuell markierte <b>Node<\/b>-Element, da das neue Einzelteil unterhalb dieses Elements angelegt werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuesEinzelteilI_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEinzelteilID<span style=\"color:blue;\"> As Long<\/span>, lngBaugruppeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node, objNodeNeu<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>, strTyp<span style=\"color:blue;\"> As String<\/span>, strEinzelteil<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.SelectedItem\r\n     strKey = objNode.Key\r\n     KeyParsen strKey, strTyp, lngBaugruppeID\r\n     strForm = \"frmEinzelteil\"\r\n     DoCmd.OpenForm strForm, windowMode:=acDialog, Datamode:=acFormAdd\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strForm)<span style=\"color:blue;\"> Then<\/span>\r\n         lngEinzelteilID = Nz(Forms(strForm)!EinzelteilID)\r\n         <span style=\"color:blue;\">If <\/span>lngEinzelteilID &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             Forms(strForm).Dirty = <span style=\"color:blue;\">False<\/span>\r\n             strEinzelteil = Nz(Forms(strForm)!Einzelteil)\r\n             <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n             Select Case strTyp\r\n                 <span style=\"color:blue;\">Case <\/span>\"r\"\r\n                     db.Execute \"UPDATE tblEinzelteile SET IstProdukt = -1 WHERE EinzelteilID = \" _\r\n                         & lngEinzelteilID, dbFailOnError\r\n                     <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, objNode.Key _\r\n                         & \"|p\" & lngEinzelteilID, strEinzelteil, \"elements_hierarchy\")\r\n                 <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n                     db.Execute \"INSERT INTO tblBaugruppenEinzelteile(BaugruppeID, EinzelteilID) &quot; _\r\n                         &quot;VALUES(\" & lngBaugruppeID & \", \" & lngEinzelteilID & \")\", dbFailOnError\r\n                     <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, _\r\n                         objNode.Key & \"|e\" & lngEinzelteilID, strEinzelteil, \"gearwheel\")\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         DoCmd.Close acForm, strForm\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Anlegen eines neuen Einzelteils erst per Detailformular, dann im TreeView-Steuerelement<\/span><\/b><\/p>\n<p>Die folgenden Anweisungen ermitteln wieder den <b>Key<\/b>-Wert des <b>Node<\/b>-Elements und daraus den Typ und den Prim&auml;rschl&uuml;sselwert des Elements, unter dem der neue Einzelteil-Datensatz angelegt werden soll. Hier gibt es wieder zwei M&ouml;glichkeiten: entweder das Einzelteil soll gleich als neues Produkt angelegt werden oder als Teil einer Baugruppe.<\/p>\n<p>Nun &ouml;ffnet die Prozedur das Formular <b>frmEinzelteil<\/b>, und zwar als modalen Dialog. Auf diese Weise wird der Code bei der aufrufenden Anweisung angehalten. Au&szlig;erdem &uuml;bergibt die Prozedur dem Aufruf der Methode <b>OpenForm <\/b>den Wert <b>acFormAdd <\/b>f&uuml;r den Parameter <b>DataMode<\/b>. Auf diese Weise zeigt das Formular gleich einen leeren, neuen Datensatz an (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_919_004.png\" alt=\"Anlegen eines neuen Elements per Formular\" width=\"575\" height=\"259,1887\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anlegen eines neuen Elements per Formular<\/span><\/b><\/p>\n<p>Wenn der Benutzer auf die Schaltfl&auml;che <b>cmdOK<\/b> klickt, macht er das Formular unsichtbar und die aufrufende Prozedur l&auml;uft weiter. Dabei pr&uuml;ft diese zun&auml;chst mit der Hilfsfunktion <b>IstFormular-Ge-oeffnet<\/b>, ob das Formular noch ge&ouml;ffnet ist. Ist dies der Fall, liest die Prozedur den Wert des Prim&auml;rschl&uuml;sselfeldes <b>EinzelteilID <\/b>in die Variable <b>lngEinzelteilID <\/b>ein. Vorsichtshalber verwendet die Prozedur dabei die Funktion <b>Nz<\/b>, die den Wert <b>0 <\/b>zur&uuml;ckliefert, sollte das <b>Einzelteil-ID <\/b>noch den Wert <b>Null <\/b>enthalten. Besitzt <b>lngEinzelteilID <\/b>danach einen Wert gr&ouml;&szlig;er <b>0<\/b>, speichert die Prozedur zun&auml;chst den gegebenenfalls noch in Bearbeitung befindlichen Datensatz des Formulars <b>frmEinzelteil<\/b>, indem sie die Eigenschaft <b>Dirty <\/b>auf den Wert <b>False <\/b>einstellt. Dann liest sie die Bezeichnung des Einzelteils aus dem Feld <b>Einzelteil <\/b>in die Variable <b>strEinzelteil <\/b>ein.<\/p>\n<p>Schlie&szlig;lich folgt die Unterscheidung nach dem beim Aufruf der Prozedur aktiven Element im <b>TreeView<\/b>-Steuerelement: War das Root-Element mit der Beschriftung <b>Produkte <\/b>aktiv, soll das Einzelteil gleich als Produkt angelegt werden (also mit <b>IstProdukt <\/b>gleich <b>-1<\/b>\/<b>True<\/b>) &#8211; unabh&auml;ngig davon, was der Benutzer im Formular <b>frmEinzelteil <\/b>angegeben hat. In diesem Fall hat <b>strTyp <\/b>den Wert <b>r,<\/b> was in einer <b>Select Case<\/b>-Bedingung ausgewertet wird. Dort aktualisiert die Prozedur noch das Feld <b>IstProdukt <\/b>mit dem Wert <b>-1 <\/b>und legt das neue Element im <b>TreeView<\/b>-Steuerelement an. War hingegen eines der Elemente aktiv, die im <b>TreeView<\/b>-Steuerelement mit dem Buchstaben <b>p <\/b>f&uuml;r <b>Produkt <\/b>oder <b>b <\/b>wie <b>Bauteil <\/b>gekennzeichnet sind, soll das neue Einzelteil gleich als Teil einer Baugruppe angelegt werden.<\/p>\n<p>In diesem Fall muss ein neuer Eintrag zur Verkn&uuml;pfungstabelle <b>tblBaugruppenEinzelteile <\/b>hinzugef&uuml;gt werden, welcher das neue Einzelteil mit der im <b>TreeView<\/b>-Steuerelement markierten Baugruppe verkn&uuml;pft. Schlie&szlig;lich legt die Prozedur noch ein neues <b>Einzelteil<\/b>-Element im <b>TreeView<\/b>-Steuerelement an, und zwar unterhalb des zuletzt markierten Elements.<\/p>\n<p>Nachdem diese Aufgaben erledigt sind, kann die Prozedur auch das bislang nur unsichtbare Formular <b>frmEinzelteil <\/b>schlie&szlig;en.<\/p>\n<p><b>Anlegen von Elementen mit Unterformular<\/b><\/p>\n<p>Fehlt noch eine weitere interessante Variante, die oft Anwendung finden d&uuml;rfte: das Anlegen von Elementen im Unterformular auf dem gleichen Formular wie das <b>TreeView<\/b>-Element.<\/p>\n<p>Dazu f&uuml;gen wir der Einfachheit halber das Formular <b>frmEinzelteil <\/b>dem Formular <b>frmStuecklisteTreeView <\/b>als Unterformular hinzu (s. Bild 5). Damit dieses eingeblendet wird, sobald der Benutzer im <b>TreeView<\/b>-Steuerelement auf ein <b>Einzelteil<\/b>-Element klickt, f&uuml;gen Sie eine Ereignisprozedur hinzu, die durch das Ereignis <b>NodeClick <\/b>des <b>TreeView<\/b>-Steuerelements ausgel&ouml;st wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_919_005.png\" alt=\"TreeView-Steuerelement und Unterfomular in einem Formular\" width=\"650\" height=\"414,5142\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: TreeView-Steuerelement und Unterfomular in einem Formular<\/span><\/b><\/p>\n<p>Die Prozedur sieht wie in Listing 6 aus und analysiert zun&auml;chst die in der <b>Key<\/b>-Eigenschaft des mit dem Parameter <b>Node <\/b>&uuml;bergebenen angeklickten Elements. Falls <b>strTyp <\/b>den Wert <b>e <\/b>enth&auml;lt, handelt es sich um ein Einzelteil. In diesem Fall soll das Unterformular-Steuerelement <b>frmEinzelteil <\/b>sichtbar gemacht werden. Au&szlig;erdem soll die Prozedur den Inhalt des Unterformulars so filtern, dass nur der zum aktuell angeklickten Element passende Datensatz angezeigt wird. Die dazu n&ouml;tigen Informationen liefert die <b>Key<\/b>-Eigenschaft. Hat der Benutzer ein anderes Element angeklickt, blendet die Prozedur das Unterformular-Steuerelement aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objTreeView_NodeClick(ByVal Node<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node)\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/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     strKey = Node.Key\r\n     KeyParsen strKey, strTyp, lngID\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"e\"\r\n             <span style=\"color:blue;\">With<\/span> Me!frmEinzelteil\r\n                 .Visible = <span style=\"color:blue;\">True<\/span>\r\n                 .Form.Filter = \"EinzelteilID = \" & lngID\r\n                 .Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             Me!frmEinzelteil.Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     SchaltflaechenAktivieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Aktivieren und Filtern des Unterformulars beim Klick auf ein TreeView-Element<\/span><\/b><\/p>\n<p>Nun kommen wir zum interessanten Teil: Was soll geschehen, wenn der Benutzer auf die Schaltfl&auml;che <b>cmdNeuesEinzelteilII <\/b>klickt Prinzipiell k&ouml;nnte dies mehrere Aktionen ausl&ouml;sen:<\/p>\n<ul>\n<li>Das Unterformular zeigt einen neuen, leeren Datensatz der Tabelle <b>tblEinzelteile <\/b>an.<\/li>\n<li>Das Treeview-Steuerelement zeigt ein neues, leeres Element mit der Aufforderung zum Eintragen der Bezeichnung an.<\/li>\n<\/ul>\n<p>Aber was geschieht als N&auml;chstes Wenn der neue Datensatz im Unterformular angezeigt wird, sieht der Benutzer nicht direkt, ob das neue Einzelteil an der gew&uuml;nschten Stelle im <b>TreeView<\/b>-Steuerelement eingef&uuml;gt wurde. Wenn das Element zun&auml;chst nur im <b>TreeView<\/b>-Steuerelement angelegt wird, k&ouml;nnte das Problem auftreten, dass der Benutzer nicht mehr die vollst&auml;ndigen Daten im Unterformular eingibt.<\/p>\n<p>Also w&auml;hlen wir die sichere Variante: Wir legen direkt ein neues Element an und vergeben einen Dummy-Wert f&uuml;r die Bezeichnung des Einzelteils. Dann k&ouml;nnen wir diesen Wert gleichzeitig im <b>TreeView<\/b>-Steuerelement und auch im Unterformular anzeigen und der Benutzer kann die Daten im Unterformular bequem erg&auml;nzen.<\/p>\n<p>Damit der Benutzer die Gelegenheit hat, das Anlegen abzubrechen, f&uuml;gen wir dem Unterformular noch eine Schaltfl&auml;che namens <b>cmdAbbrechen <\/b>hinzu, die den neuen Datensatz verwirft und den Eintrag im <b>TreeView<\/b>-Steuerelement wieder entfernt.<\/p>\n<p>Und um dem Ganzen die Krone aufzusetzen, sorgen wir auch noch daf&uuml;r, dass die vom Benutzer im Unterformular ge&auml;nderte Bezeichnung des Einzelteils in Echtzeit auf das entsprechende Element im <b>TreeView<\/b>-Steuerelement &uuml;bertragen wird.<\/p>\n<p><b>Neuer Datensatz<\/b><\/p>\n<p>Damit das Unterformular zum Anlegen eines neuen Datensatzes eingeblendet wird, muss der Benutzer zun&auml;chst auf die Schaltfl&auml;che <b>cmdNeuesEinzelteilII<\/b> klicken. Dies l&ouml;st dann die Ereignisprozedur aus Listing 7 aus. Die Prozedur f&uuml;hrt die bereits besprochenen Schritte zur Ermittlung des aktuell markierten Elements im <b>TreeView<\/b>-Steuerelement durch. Danach stellt die Prozedur die Eigenschaft <b>Visible <\/b>des Unterformular-Steuerelements <b>frmEinzelteil <\/b>auf <b>True <\/b>ein, um dieses einzublenden. Das Unterformular erh&auml;lt den Fokus und mit der Methode <b>GotoRecord <\/b>des <b>DoCmd<\/b>-Objekts und dem Wert <b>acNewRec <\/b>f&uuml;r den Parameter <b>Record <\/b>wird ein neuer Datensatz angelegt. Damit der neue Datensatz im Unterformular und sp&auml;ter im <b>TreeView<\/b>-Steuerelement mit gleichem Namen erscheint, stellt die Prozedur dann den Wert des Feldes <b>Einzelteil <\/b>auf <b>[Neues Einzelteil] <\/b>ein. Dann speichert sie den Prim&auml;rschl&uuml;sselwert des neuen, aber noch nicht gesicherten Datensatzes in der Variablen <b>lngNeuID <\/b>ab.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuesEinzelteilII_Click()\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>objNode<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node, objNodeNeu<span style=\"color:blue;\"> As <\/span>MSComctlLib.Node\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/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>, lngNeuID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objNode = objTreeView.SelectedItem\r\n     strKey = objNode.Key\r\n     KeyParsen strKey, strTyp, lngID\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">With<\/span> Me!frmEinzelteil\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .SetFocus\r\n         DoCmd.GoToRecord Record:=acNewRec\r\n         .Form.Einzelteil = \"[Neues Einzelteil]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     lngNeuID = Me.frmEinzelteil.Form.EinzelteilID\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"r\"\r\n             <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, \"e\" & lngNeuID, _\r\n                 \"[Neues Einzelteil]\", \"elements_hierarchy\")\r\n         <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n             <span style=\"color:blue;\">Set<\/span> objNodeNeu = objTreeView.Nodes.Add(objNode.Key, tvwChild, \"e\" & lngNeuID, _\r\n                 \"[Neues Einzelteil]\", \"gearwheel\")\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     objNode.Expanded = <span style=\"color:blue;\">True<\/span>\r\n     objTreeView.SelectedItem = objNodeNeu\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Anlegen eines neuen Datensatzes im Unterformular<\/span><\/b><\/p>\n<p>Dann folgt die obligatorische Fallunterscheidung entsprechend dem aktiven <b>TreeView<\/b>-Element: Im Falle des Root-Elements soll das neue Element als Produkt direkt unterhalb des Root-Elements angelegt werden. Dies erledigt der Aufruf der <b>Add<\/b>-Methode, wobei als <b>Key<\/b>-Wert schlicht und einfach <b>e <\/b>plus dem Prim&auml;rschl&uuml;sselwert zum Einsatz kommt.<\/p>\n<p>Wenn der Benutzer den Datensatz im Unterformular speichert, soll also der Eintrag wie etwa <b>e123 <\/b>durch den richtigen Wert, also zum Beispiel <b>r0|e123 <\/b>ersetzt werden &#8211; dazu sp&auml;ter mehr. Handelt es sich um ein Baugruppen-Element, f&uuml;gt die <b>Add<\/b>-Methode das neue Element mit der Beschriftung <b>[Neues Einzelteil] <\/b>unterhalb des entsprechenden Elements an.<\/p>\n<p>Dann stellt sie die Eigenschaft <b>Expanded <\/b>des &uuml;bergeordneten Elements auf <b>True<\/b>, damit das neue Element sichtbar ist. Au&szlig;erdem markiert sie das neue Element. Der Fokus wird diesmal nicht auf das <b>TreeView<\/b>-Steuerelement verschoben, da der neue Datensatz ja noch im Unterformular bearbeitet werden soll.<\/p>\n<p><b>Bezeichnung des TreeView-Elements live &auml;ndern<\/b><\/p>\n<p>Nun k&ouml;nnen mehrere Dinge geschehen. Das Wahrscheinlichste ist, dass der Benutzer zun&auml;chst die Bezeichnung des Elements anpasst. In diesem Fall l&ouml;st er das Ereignis <b>Bei &auml;nderung <\/b>des Textfeldes <b>txtEinzelteil<\/b> aus, was die Ausf&uuml;hrung der Ereignisprozedur aus Listing 8 nach sich zieht.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtEinzelteil_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>bolParent<span style=\"color:blue;\"> As Boolean<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     bolParent = <span style=\"color:blue;\">Not<\/span> Me.Parent Is Nothing\r\n     <span style=\"color:blue;\">If <\/span>bolParent<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n             Me.Parent!ctlTreeView.Nodes(\"e\" & Me!EinzelteilID).Text = Me!txtEinzelteil.Text\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Beim &auml;ndern der Bezeichnung im Formular soll auch das TreeView-Element angepasst werden.<\/span><\/b><\/p>\n<p>Dann wird er die &uuml;brigen Werte eintragen und schlie&szlig;lich den Datensatz speichern &#8211; beispielsweise durch Bet&auml;tigen der Schaltfl&auml;che <b>cmdOK<\/b>. Diese l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>bolParent<span style=\"color:blue;\"> As Boolean<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     bolParent = <span style=\"color:blue;\">Not<\/span> Me.Parent Is Nothing\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>bolParent<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur pr&uuml;ft, ob das Formular als Unterformular ge&ouml;ffnet ist, und speichert dann den aktuellen Datensatz.<\/p>\n<p>Das Speichern l&ouml;st zwei Ereignisse aus: <b>Vor Aktualisierung <\/b>und <b>Nach Aktualisierung<\/b>. Das Erste der beiden pr&uuml;ft lediglich, ob das Formular aktuell einen neuen Datensatz enth&auml;lt, und speichert das Ergebnis in der Variablen <b>bolNewRecord<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_BeforeUpdate(Cancel<span style=\"color:blue;\"> As <\/span> Integer)\r\n     bolNewRecord = Me.NewRecord\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Variable muss noch im Kopf des Klassenmoduls <b>Form_frmEinzelteil <\/b>deklariert werden:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolNewRecord<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Dies ist eine Vorbereitung f&uuml;r die Ausf&uuml;hrung der Ereignisprozedur <b>Form_AfterUpdate<\/b> (s. Listing 9). Hier k&ouml;nnen wir n&auml;mlich nicht mehr pr&uuml;fen, ob der gespeicherte Datensatz ein frisch angelegter Datensatz war oder ein bereits vorhandener. Deshalb haben wir das bereits in der Ereignisprozedur <b>Form_BeforeUpdate <\/b>erledigt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>bolParent<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>, Dim strTyp<span style=\"color:blue;\"> As String<\/span>, strKeyParent<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     bolParent = <span style=\"color:blue;\">Not<\/span> Me.Parent Is Nothing\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me.Parent Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolNewRecord = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n             strKeyParent = Me.Parent!ctlTreeView.Nodes(\"e\" & Me!EinzelteilID).Parent.Key\r\n             strKey = strKeyParent & \"|e\" & Me!EinzelteilID\r\n             Me.Parent!ctlTreeView.Nodes(\"e\" & Me!EinzelteilID).Key = strKey\r\n             KeyParsen strKeyParent, strTyp, lngID\r\n             Select Case strTyp\r\n                 <span style=\"color:blue;\">Case <\/span>\"r\"\r\n                     db.Execute \"UPDATE tblEinzelteile SET IstProdukt = -1 &quot; _\r\n                         &amp; &quot;WHERE EinzelteilID = \" & Me!EinzelteilID, dbFailOnError\r\n                 <span style=\"color:blue;\">Case <\/span>\"p\", \"b\"\r\n                     db.Execute \"INSERT INTO tblBaugruppenEinzelteile(&quot; _\r\n                         &amp; &quot;BaugruppeID, EinzelteilID) VALUES(\" & lngID & \", \" _\r\n                         & Me!EinzelteilID & \")\", dbFailOnError\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n             bolNewRecord = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Diese Ereignisprozedur wird nach dem Speichern ausgel&ouml;st.<\/span><\/b><\/p>\n<p><b>Form_AfterUpdate <\/b>pr&uuml;ft wiederum, ob das Formular als Unterformular eingebunden ist und ob <b>bolNewRecord <\/b>den Wert <b>True <\/b>aufweist. Ist dies der Fall, liest die Prozedur zun&auml;chst den <b>Key<\/b>-Wert des &uuml;bergeordneten Elements des in der Prozedur <b>cmdNeuesEinzelteilII_Click <\/b>erstellten <b>Node<\/b>-Objekts f&uuml;r den neuen Eintrag ein. Der Ausdruck zum Ermitteln dieses Wertes sieht etwas kompliziert aus:<\/p>\n<pre>Me.Parent!ctlTreeView.Nodes(\"e\" & Me!EinzelteilID).Parent.Key<\/pre>\n<p>Dies ermittelt zun&auml;chst das &uuml;bergeordnete Formular (<b>Parent<\/b>), dann das darin enthaltene Steuerelement <b>ctlTreeView <\/b>und den soeben angelegten Node (<b>Nodes(&#8222;e&#8220; &#038; Me!EinzelteilID)<\/b>). Dessen <b>Parent<\/b>-Eigenschaft referenziert das &uuml;bergeordnete <b>Element <\/b>und <b>Key <\/b>liefert schlie&szlig;lich den gew&uuml;nschten Wert (also etwa <b>r0|b123<\/b>).<\/p>\n<p>Der vor&uuml;bergehende Key des neu angelegten Elements hei&szlig;t ja beispielsweise <b>e123<\/b>. Dieser soll nun durch den endg&uuml;ltigen Key ersetzt werden &#8211; also etwa <b>r0|b123|e123<\/b>. Dazu setzt die Prozedur die beiden Elemente zusammen und weist diese dann der <b>Key<\/b>-Eigenschaft des neuen Elements zu.<\/p>\n<p><b>KeyParsen <\/b>ermittelt wieder den <b>Typ <\/b>und die <b>ID<\/b>, diesmal f&uuml;r das &uuml;bergeordnete Element. Ist der Typ <b>r<\/b>, aktualisiert die Prozedur noch den Wert des Feldes <b>IstProdukt <\/b>f&uuml;r den neuen Datensatz der Tabelle <b>tblEinzelteile <\/b>auf <b>-1 <\/b>(<b>True<\/b>). F&uuml;r die Typen <b>p <\/b>und <b>b <\/b>muss noch ein Datensatz in der Tabelle <b>tblBaugruppenEinzelteile <\/b>angelegt werden, welche das &uuml;bergeordnete und das neue Element im <b>TreeView<\/b>-Steuerelement nun auch &uuml;ber das Datenmodell miteinander verheiratet. Schlie&szlig;lich stellt die Prozedur die Variable <b>bolNewRecord <\/b>wieder auf den Wert <b>False <\/b>ein.<\/p>\n<p>Fehlt noch die Funktion der Schaltfl&auml;che <b>cmdAbbrechen<\/b>. Normalerweise l&auml;sst sich das Anlegen eines Datensatzes einfach per <b>Undo <\/b>regeln, aber hier muss ja auch noch der bereits im <b>TreeView<\/b>-Steuerelement angelegte Eintrag entfernt werden. Dies erledigt die Ereignisprozedur <b>cmdAbbrechen_Click <\/b>aus Listing 10.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>bolParent<span style=\"color:blue;\"> As Boolean<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     bolParent = <span style=\"color:blue;\">Not<\/span> Me.Parent Is Nothing\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>bolParent<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me.Parent\r\n             !ctlTreeView.Nodes.Remove \"e\" & Me!EinzelteilID\r\n             !ctlTreeView.SelectedItem = Me.Parent!ctlTreeView.Nodes(\"r0\")\r\n             Me.Undo\r\n             .SetFocus\r\n             !ctlTreeView.SetFocus\r\n             !frmEinzelteil.Visible = <span style=\"color:blue;\">False<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         DoCmd.Close acForm, Me.Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Abbrechen des Anlegenes eines neuen Datensatzes im Unterformular<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft, ob das Formular als Unterformular ge&ouml;ffnet wurde und entfernt den Eintrag mit dem <b>Key<\/b>, der aus dem Buchstaben <b>e <\/b>und dem Prim&auml;rschl&uuml;sselwert des neuen Datensatzes besteht. Au&szlig;erdem markiert sie das Root-Element und setzt den Fokus auf das <b>TreeView<\/b>-Steuerelement. Schlie&szlig;lich blendet sie das Unterformular aus.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Es gibt eine Reihe von M&ouml;glichkeiten, Eintr&auml;ge zu einem <b>TreeView<\/b>-Steuerelement hinzuzuf&uuml;gen, das an ein oder mehrere Tabellen gebunden ist. Dieser Beitrag hat vier davon vorgestellt. Alle ben&ouml;tigen einige Zeilen VBA-Code &#8211; aber wer bereits etwas Zeit mit der Programmierung des <b>TreeView<\/b>-Steuerelements verbracht hat, wei&szlig;, dass dies der Preis ist, den man zahlt, wenn man mehr bieten m&ouml;chte als die mit Access gelieferten Steuerelemente mit der M&ouml;glichkeit zur direkten Anbindung an Tabellen und Felder.<\/p>\n<p>Sehen Sie sich den Beitrag <b>St&uuml;cklisten <\/b>f&uuml;r das komplette Beispiel des hier verwendeten <b>TreeView<\/b>-Steuerelements an (<b>www.access-im-unternehmen.de\/923<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TreeViewElementeAnlegen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{CED1C48C-61EC-4672-9BAE-82C81FB78193}\/aiu_919.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Anlegen neuer Elemente in einem TreeView-Steuerelement, das die Daten aus ein oder mehreren Tabellen anzeigt, ist nicht immer trivial. Soll das Anlegen &uuml;ber ein Detailformular erfolgen und der Eintrag dann zum TreeView hinzugef&uuml;gt werden Oder reicht vielleicht die Bezeichnung des neuen Elements zun&auml;chst aus, um dieses zum TreeView hinzuzuf&uuml;gen &#8211; dann w&auml;re eine InputBox oder die direkte Angabe im TreeView eine L&ouml;sung. Dieser Beitrag zeigt verschiedene M&ouml;glichkeiten, um neue Elemente anzulegen.<\/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":[66012014,662014,44000023],"tags":[],"class_list":["post-55000919","post","type-post","status-publish","format-standard","hentry","category-66012014","category-662014","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: Neue Elemente anlegen - 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_Neue_Elemente_anlegen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TreeView: Neue Elemente anlegen\" \/>\n<meta property=\"og:description\" content=\"Das Anlegen neuer Elemente in einem TreeView-Steuerelement, das die Daten aus ein oder mehreren Tabellen anzeigt, ist nicht immer trivial. Soll das Anlegen &uuml;ber ein Detailformular erfolgen und der Eintrag dann zum TreeView hinzugef&uuml;gt werden Oder reicht vielleicht die Bezeichnung des neuen Elements zun&auml;chst aus, um dieses zum TreeView hinzuzuf&uuml;gen - dann w&auml;re eine InputBox oder die direkte Angabe im TreeView eine L&ouml;sung. Dieser Beitrag zeigt verschiedene M&ouml;glichkeiten, um neue Elemente anzulegen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:18:44+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d\" \/>\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=\"27\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_Neue_Elemente_anlegen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"TreeView: Neue Elemente anlegen\",\"datePublished\":\"2020-05-22T21:18:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/\"},\"wordCount\":4523,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/39807e488d49442a95c9f77f3ffbf84d\",\"articleSection\":[\"1\\\/2014\",\"2014\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/\",\"name\":\"TreeView: Neue Elemente anlegen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/39807e488d49442a95c9f77f3ffbf84d\",\"datePublished\":\"2020-05-22T21:18:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/39807e488d49442a95c9f77f3ffbf84d\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/39807e488d49442a95c9f77f3ffbf84d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TreeView_Neue_Elemente_anlegen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TreeView: Neue Elemente anlegen\"}]},{\"@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: Neue Elemente anlegen - 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_Neue_Elemente_anlegen\/","og_locale":"de_DE","og_type":"article","og_title":"TreeView: Neue Elemente anlegen","og_description":"Das Anlegen neuer Elemente in einem TreeView-Steuerelement, das die Daten aus ein oder mehreren Tabellen anzeigt, ist nicht immer trivial. Soll das Anlegen &uuml;ber ein Detailformular erfolgen und der Eintrag dann zum TreeView hinzugef&uuml;gt werden Oder reicht vielleicht die Bezeichnung des neuen Elements zun&auml;chst aus, um dieses zum TreeView hinzuzuf&uuml;gen - dann w&auml;re eine InputBox oder die direkte Angabe im TreeView eine L&ouml;sung. Dieser Beitrag zeigt verschiedene M&ouml;glichkeiten, um neue Elemente anzulegen.","og_url":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:18:44+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"TreeView: Neue Elemente anlegen","datePublished":"2020-05-22T21:18:44+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/"},"wordCount":4523,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d","articleSection":["1\/2014","2014","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/","url":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/","name":"TreeView: Neue Elemente anlegen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d","datePublished":"2020-05-22T21:18:44+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/39807e488d49442a95c9f77f3ffbf84d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/TreeView_Neue_Elemente_anlegen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"TreeView: Neue Elemente anlegen"}]},{"@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\/55000919","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=55000919"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000919\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}