{"id":55000833,"date":"2012-06-01T00:00:00","date_gmt":"2020-05-22T21:54:22","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=833"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Drag_and_Drop_mit_TreeView_und_ListView","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/","title":{"rendered":"Drag and Drop mit TreeView und ListView"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie mit ListView- und TreeView-Steuerelementen arbeiten, sind Drag-and-Drop-Operationen ein tolles Hilfsmittel, um Daten zwischen den Steuerelementen hin- und herzuschieben. In der Anwendung aiuTimeplanner gibt es gleich zwei ListView- und ein TreeView-Steuerelement &#8211; gen&uuml;gend M&ouml;glichkeiten also, um Drag and Drop einmal anhand eines Praxisbeispiels zu demonstrieren. Dabei sollen Aufgaben aus dem TreeView in beide ListViews verschoben werden sowie von ListView zu ListView &#8211; und das Verschieben und Kopieren von Eintr&auml;gen innerhalb eines ListView-Steuerelements ist ebenfalls gefragt.<\/b><\/p>\n<p>Das Hin- und Herschieben von Elementen zwischen verschiedenen ListView- und TreeView-Eintr&auml;gen ist prinzipiell nicht schwierig. Beim Start des Drag-and-Drop-Vorgangs wird immer das <b>OLEStartDrag<\/b>-Ereignis ausgel&ouml;st, dem Sie mit dem Parameter <b>Data<\/b> Informationen &uuml;ber die zu verschiebenden Daten mitgeben. Beim &Uuml;berfahren des Drop-Ziels und beim Fallenlassen werden die beiden Ereignisprozeduren <b>OLEDragOver <\/b>und <b>OLEDragDrop <\/b>ausgel&ouml;st, denen Sie wiederum &uuml;ber den gleichen Parameter die beim Start &uuml;bergebenen Daten entnehmen k&ouml;nnen.<\/p>\n<p>Sie starten also beispielsweise von einem ListView-Steuerelement einen Drag-and-Drop-Vorgang und speisen den <b>Key<\/b>-Wert des gezogenen Elements in den Parameter <b>Data <\/b>ein, beispielsweise <b>t123<\/b>. Dann sollte <b>t <\/b>einen Hinweis auf das Steuerelement geben, von dem aus der Vorgang gestartet wurde, und <b>123 <\/b>entspricht dem Prim&auml;rschl&uuml;sselwert des Datensatzes, der per Drag and Drop bewegt werden soll.<\/p>\n<p>Im Beispiel, das im Beitrag <b>Tagesablauf verwalten mit dem aiuTimeplanner <\/b>(<b>www.access-im-unternehmen.de\/839<\/b>) genauer erl&auml;utert wird, gibt es drei Steuerelemente, die Drag-and-Drop-Operationen unterst&uuml;tzen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">das ListView-Steuerelement <b>lvwDailyTasks<\/b>,<\/li>\n<li class=\"aufz-hlung\">das TreeView-Steuerelement <b>tvwTasks <\/b>und<\/li>\n<li class=\"aufz-hlung\">das ListView-Steuerelement <b>lvwTimeplan<\/b>.<\/li>\n<\/ul>\n<p>Es gibt gleich eine ganze Reihe m&ouml;glicher Drag-and-Drop-Operationen, die durch die Pfeile in Bild 1 verdeutlicht werden:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/DragAndDropMitTreeViewUndListView-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: M&ouml;gliche Drag-and-Drop-Vorg&auml;nge in der Beispielanwendung<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Vom TreeView zur Tagesliste: Stellt die Eigenschaft <b>HeuteErledigen <\/b>auf <b>True <\/b>ein und f&uuml;gt den Eintrag zur Tagesliste hinzu.<\/li>\n<li class=\"aufz-hlung\">Vom TreeView zu einem anderen TreeView-Element: Ordnet die Aufgabe einer anderen Aufgabe unter.<\/li>\n<li class=\"aufz-hlung\">Vom TreeView an eine leere Stelle im TreeView: L&ouml;scht den Eintrag nach R&uuml;ckfrage. Bei gedr&uuml;ckter Umschalttaste wird ohne R&uuml;ckfrage gel&ouml;scht.<\/li>\n<li class=\"aufz-hlung\">Vom TreeView zur T&auml;tigkeitsliste: F&uuml;gt eine neue T&auml;tigkeit auf Basis der gezogenen Aufgabe hinzu.<\/li>\n<li class=\"aufz-hlung\">Von der Tagesliste zur T&auml;tigkeitsliste: F&uuml;gt eine neue T&auml;tigkeit auf Basis der gezogenen Aufgabe hinzu.<\/li>\n<li class=\"aufz-hlung\">Von der Tagesliste in einen leeren Bereich der Tagesliste: Stellt die Eigenschaft <b>HeuteErledigen <\/b>auf <b>False <\/b>ein und entfernt den Eintrag aus der Liste.<\/li>\n<li class=\"aufz-hlung\">Von der T&auml;tigkeitsliste an eine andere Stelle der T&auml;tigkeitsliste: Verschiebt die T&auml;tigkeit.<\/li>\n<li class=\"aufz-hlung\">Von der T&auml;tigkeitsliste an eine andere Stelle der T&auml;tigkeitsliste, diesmal mit gedr&uuml;ckter <b>Strg<\/b>-Taste: Kopiert die T&auml;tigkeit.<\/li>\n<\/ul>\n<p><b>Gezogene Elemente identifizieren<\/b><\/p>\n<p>Die Elemente k&ouml;nnen &uuml;ber den Wert der Eigenschaft <b>Key <\/b>dem jeweiligen Steuerelement zugeordnet werden, also beispielsweise <b>d <\/b>f&uuml;r <b>lvwDailyTasks<\/b>, <b>t <\/b>f&uuml;r <b>tvwTasks <\/b>und <b>p <\/b>f&uuml;r <b>lvwTimeplan<\/b>. So kann man &uuml;ber den Wert des Parameters <b>Data <\/b>jeweils am ersten Buchstaben erkennen, von welchem Steuerelement aus der Drag-and-Drop-Vorgang gestartet wurde, die folgenden Zahlen liefern die ID des Elements aus der jeweiligen Tabelle.<\/p>\n<p>Dies wird nat&uuml;rlich etwas schwieriger, wenn Sie etwa in einem TreeView-Steuerelement die Daten aus mehreren Tabellen speichern und beispielsweise Kunden mit dem Pr&auml;fix <b>k <\/b>und Artikel mit dem Pr&auml;fix <b>a <\/b>versehen.<\/p>\n<p>Dies erh&ouml;ht jedoch nur die Anzahl der m&ouml;glichen Kombinationen und damit die verschiedenen Arten, einen Drag-and-Drop-Vorgang anhand von Quelle und Ziel zu verarbeiten. Sie k&ouml;nnen nach wie vor mit einem Pr&auml;fix-Buchstaben arbeiten, der die Art der Daten beschreibt, und daran den Prim&auml;rschl&uuml;sselwert des entsprechenden Elements anh&auml;ngen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Starten eines Drag-and-Drop-Vorgangs<\/p>\n<p>Der Start eines Drag-and-Drop-Vorgangs beginnt immer mit dem Herunterdr&uuml;cken der Maustaste auf einem Element eines ListView- oder TreeView-Steuerelements und dem Bewegen des Mauszeigers bei gedr&uuml;ckter Maustaste. Dies ist der Moment, in dem Sie Informationen &uuml;ber das gezogene Element aufnehmen und speichern m&uuml;ssen.<\/p>\n<p>Das passende Ereignis lautet <b>OLEStartDrag<\/b> und kann &uuml;ber die beiden Kombinationsfelder des Klassenmoduls des Formulars hinzugef&uuml;gt werden (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/DragAndDropMitTreeViewUndListView-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Hinzuf&uuml;gen des OLEStartDrag-Ereignisses<\/span><\/b><\/p>\n<p>Damit dieses Ereignis und die beiden im Verlauf dieses Beitrags vorgestellten Ereignisse nach Wunsch ausgel&ouml;st werden, m&uuml;ssen Sie f&uuml;r die entsprechenden Objektvariablen au&szlig;erdem noch je zwei Eigenschaften einstellen &#8211; dies geschieht in Konfigurationsprozeduren, die im Beitrag <b>Tagesablauf verwalten mit aiuTimeplanner <\/b>(<b>www.access-im-unternehmen.de\/839<\/b>) beschrieben werden:<\/p>\n<pre>objTasks.OLEDragMode = ccOLEDragAutomatic\r\nobjTasks.OLEDropMode = ccOLEDropManual<\/pre>\n<p>Die drei Ereignisprozeduren <b>objTasks_OLEStartDrag<\/b>, <b>objDailyTasks_OLEStartDrag <\/b>und <b>objTimeplan_OLEStartDrag <\/b>werden dann wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-50-anchor\">Listing 1<\/a><\/span> angelegt und wie die Prozedur <b>objTasks_OLEStartDrag <\/b>gef&uuml;llt.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Diese Prozeduren werden beim Starten eines Drag-and-Drop-Vorgangs ausgel&ouml;st.<\/p>\n<pre>Private Sub objTasks_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)\r\n    Dim objNode As MSComctlLib.Node\r\n    Set objNode = objTasks.SelectedItem\r\n    If objNode Is Nothing Then Exit Sub\r\n    Data.Clear\r\n    Data.SetData objNode.Key, ccCFText\r\nEnd Sub\r\nPrivate Sub objTimeplan_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)\r\n    Dim objListitem As MSComctlLib.ListItem\r\n    Set objListitem = objDailyTasks.SelectedItem\r\n    If objListitem Is Nothing Then Exit Sub\r\n    Data.Clear\r\n    Data.SetData objListitem.Key, ccCFText\r\nEnd Sub\r\nPrivate Sub objDailyTasks_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)\r\n    ... wie objTimeplan_OLEStartDrag\r\nEnd Sub<\/pre>\n<p>Die Prozeduren ermitteln jeweils das beim Start des Drag-Vorgangs markierte Element. Ist kein Element markiert, wird die Prozedur beendet. Anderenfalls wird der Parameter <b>Data <\/b>erst geleert und dann mit dem Wert der <b>Key<\/b>-Eigenschaft des betroffenen Elements gef&uuml;llt, also beispielsweise <b>t123 <\/b>beim Ziehen eines Elements des Aufgabenbaums, <b>d234 <\/b>beim Ziehen eines Elements der Tagesliste oder <b>p345 <\/b>beim Ziehen eines Elements der T&auml;tigkeitenliste.<\/p>\n<p>Damit enth&auml;lt der Parameter <b>Data <\/b>genaue Informationen &uuml;ber den Ursprung der Drag-and-Drop-Operation und &uuml;ber den Prim&auml;rschl&uuml;sselwert des gezogenen Elements.<\/p>\n<p><b>Ziel beim &Uuml;berfahren markieren<\/b><\/p>\n<p>Damit der Benutzer erkennt, wo er ein Element fallenlassen kann und wo nicht, markieren wir potenzielle Ziele beim &Uuml;berfahren. Dies erledigen die Ereignisprozeduren <b>objTasks_OLEDragOver<\/b>, <b>objDailyTasks_OLEDragOver <\/b>und <b>objTimeplan_OLEDragOver<\/b>. Die Prozeduren sind f&uuml;r alle drei Steuerelemente sehr &auml;hnlich aufgebaut, sodass wir nur eines in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-53-anchor\">Listing 2<\/a><\/span> komplett abbilden.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Ereignisprozedur beim &Uuml;berfahren des Zielelements<\/p>\n<pre>Private Sub objTasks_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, _\r\n        Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)\r\n    Dim strData As String\r\n    Dim strDatatype As String\r\n    If Data.GetFormat(ccCFText) = False Then Exit Sub\r\n    strData = Data.GetData(ccCFText)\r\n    strDatatype = Left(strData, 1)\r\n    Select Case strDatatype\r\n        Case &quot;t&quot;\r\n            Set objTasks.DropHighlight = objTasks.HitTest(x, y)\r\n    End Select\r\nEnd Sub<\/pre>\n<p>Dort wird zun&auml;chst das Format des gezogenen Elements gepr&uuml;ft, das den Wert <b>ccCFText <\/b>aufweisen sollte &#8211; anderenfalls wird die Prozedur abgebrochen. Ist das Format korrekt, liest die Prozedur den Inhalt des Parameters <b>Data <\/b>in eine <b>String<\/b>-Variable namens <b>strData <\/b>ein, also beispielsweise <b>t123<\/b>.<\/p>\n<p>Daraus entnimmt sie den ersten Buchstaben, der einen Hinweis auf die Herkunft des gezogenen Elements liefert. <b>t <\/b>steht wie erw&auml;hnt f&uuml;r <b>objTasks<\/b>, <b>p <\/b>f&uuml;r <b>objTimeplan <\/b>und <b>d <\/b>f&uuml;r <b>objDailyTasks<\/b>. Anhand dieses Wertes entscheidet die Prozedur, ob ein Element beim &Uuml;berfahren als Ziel markiert werden soll.<\/p>\n<p>Dies geschieht, indem mit der <b>HitTest<\/b>-Funktion des Zielsteuerelements ein Verweis auf das Zielelement ermittelt wird.<\/p>\n<p>Dieser wird anschlie&szlig;end der <b>DropHighlight<\/b>-Eigenschaft des jeweiligen Steuerelements zugeordnet, was dazu f&uuml;hrt, dass das Zielelement durch einen blauen Hintergrund markiert wird.<\/p>\n<p>F&uuml;r das Objekt <b>objDailyTasks <\/b>sieht die Prozedur genauso aus wie die f&uuml;r <b>objTasks<\/b>. Die Prozedur <b>objTimeplan_OLEDragOver <\/b>enth&auml;lt jedoch eine andere Bedingung zur Pr&uuml;fung des Datentyps des gezogenen Elements:<\/p>\n<pre>Select Case strDatatype\r\n    Case &quot;t&quot;, &quot;d&quot;, &quot;p&quot;\r\n        Set objTimeplan.DropHighlight = objTimeplan.HitTest(x, y)\r\nEnd Select<\/pre>\n<p>Das bedeutet, dass ein Element nicht nur beim Ziehen einer Aufgabe aus dem TreeView-Objekt <b>objTasks <\/b>als Ziel angeboten wird, sondern auch beim Ziehen von Elementen aus der Tagesliste und aus der T&auml;tigkeits&uuml;bersicht selbst.<\/p>\n<p><!--30percent--><\/p>\n<p>An dieser Stelle k&ouml;nnten Sie noch verschiedene Symbole einblenden, die einen Hinweis auf die geplante Aktion liefern. Dazu stellen Sie den Parameter <b>Effect<\/b> auf einen der folgenden Werte ein:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ccOLEDropEffectCopy<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ccOLEDropEffectMove<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ccOLEDropEffectNone<\/b><\/li>\n<li class=\"aufz-hlung\"><b>ccOLEDropEffectScroll<\/b><\/li>\n<\/ul>\n<p><b>Element fallenlassen<\/b><\/p>\n<p>Kommen wir zu den wirklich interessanten Aktionen &#8211; den Datenoperationen und den &auml;nderungen der Darstellung beim Fallenlassen eines Elements auf einem erlaubten Ziel.<\/p>\n<p>Als Erstes sehen wir uns das Fallenlassen eines Elements auf dem TreeView-Objekt des Formulars an. Dies l&ouml;st die Ereignisprozedur <b>objTasks_OLEDragDrop <\/b>aus (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 3<\/a><\/span>). Diese Prozedur enth&auml;lt ebenfalls einen Parameter namens <b>Data<\/b>, der den Kennbuchstaben f&uuml;r den entsprechenden Elementtyp und den Prim&auml;rschl&uuml;sselwert liefert.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Beenden des Drag-and-Drop-Vorgangs<\/p>\n<pre>Private Sub objTasks_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, _\r\n        Button As Integer, Shift As Integer, x As Single, y As Single)\r\n    ''... Deklaration\r\n    strData = Data.GetData(ccCFText)\r\n    strDatatype = Left(strData, 1)\r\n    lngKeyDrag = Mid(strData, 2)\r\n    Set objNodeDrop = objTasks.HitTest(x, y)\r\n    Select Case strDatatype\r\n    Case &quot;t&quot;\r\n        If objNodeDrop Is Nothing Then\r\n            AufgabeLoeschen lngKeyDrag, -Shift\r\n        Else\r\n            strKeyDrop = objNodeDrop.Key\r\n            lngKeydrop = Mid(strKeyDrop, 2)\r\n            Set objNodeDrag = objTasks.Nodes(strData)\r\n            If strKeyDrop = strKeyDrag Then\r\n                Exit Sub\r\n            End If\r\n            Select Case Shift\r\n                Case 0 ''verschieben\r\n                    AufgabeVerschieben lngKeydrop, lngKeyDrag\r\n                Case 1\r\n                    AufgabenZusammenfuehren Mid(objNodeDrag.Key, 2), Mid(objNodeDrop.Key, 2)\r\n            End Select\r\n            FillTree\r\n        End If\r\n    End Select\r\nEnd Sub<\/pre>\n<p>Dieser Wert wird zun&auml;chst ausgelesen. Die einzelnen Bestandteile landen in den beiden Variablen <b>strDatatype <\/b>und <b>lngKeyDrag<\/b>. Das TreeView-Steuerelement kann nur Elemente verarbeiten, die auch von dort aus gezogen wurden. Der Wert der Variablen <b>strDatatype <\/b>muss also <b>t <\/b>lauten, anderenfalls geschieht nichts.<\/p>\n<p>Danach unterscheidet die Prozedur zwei F&auml;lle, die davon abh&auml;ngen, ob die Variable <b>objNodeDrop <\/b>einen Wert enth&auml;lt oder nicht. Die Variable wird mit einem Verweis auf das TreeView-Element gef&uuml;llt, auf dem das Drag-and-Drop-Element fallengelassen wurde. Hat der Benutzer also ein Element auf ein anderes Element gezogen, wird dieses mit <b>objNodeDrop <\/b>referenziert. Hat er hingegen ein Element an eine freie Stelle innerhalb des TreeView-Steuerelements gezogen, bleibt <b>objNodeDrop <\/b>leer.<\/p>\n<p>In diesem Fall wird das gezogene Element gel&ouml;scht. Es ist nur noch offen, ob es direkt gel&ouml;scht werden soll oder ob zuvor noch eine R&uuml;ckfrage erfolgen soll. Wenn der Benutzer beim Ziehen des Elements in den leeren Raum die Umschalttaste gedr&uuml;ckt hat, wird das Element direkt gel&ouml;scht, ohne Bet&auml;tigen einer Taste erscheint noch eine R&uuml;ckfrage.<\/p>\n<p>Damit die dadurch aufgerufene Prozedur <b>AufgabeLoeschen <\/b>je nach Tastenkombination die erforderliche Meldung anzeigt, &uuml;bergeben Sie dieser den Wert des Parameters <b>Shift <\/b>mit negativem Vorzeichen (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-57-anchor\">Listing 4<\/a><\/span>). <b>0 <\/b>bedeutet dann <b>False<\/b>, <b>-1 <\/b>hei&szlig;t <b>True<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 4: L&ouml;schen einer Aufgabe<\/p>\n<pre>Public Function AufgabeLoeschen(lngAufgabeID As Long, bolLoeschen As Boolean)\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    If bolLoeschen = False Then\r\n        bolLoeschen = MsgBox(&quot;Aufgabe wirklich l&ouml;schen&quot;, vbOKCancel + vbExclamation, _\r\n            &quot;Aufgabe l&ouml;schen&quot;) = vbOK\r\n    End If\r\n    If bolLoeschen = True Then\r\n        db.Execute &quot;DELETE tblAufgaben.* FROM tblAufgaben INNER JOIN tblAufgabenUnteraufgaben &quot; _\r\n            &amp; &quot;ON tblAufgaben.AufgabeID = tblAufgabenUnteraufgaben.UnteraufgabeID &quot;_\r\n            &amp; &quot;WHERE tblAufgabenUnteraufgaben.AufgabeID = &quot; &amp; lngAufgabeID, dbFailOnError\r\n        db.Execute &quot;DELETE FROM tblAufgaben WHERE AufgabeID = &quot; &amp; lngAufgabeID, dbFailOnError\r\n        objTasks.Nodes.Remove &quot;t&quot; &amp; lngAufgabeID\r\n    End If\r\nEnd Function<\/pre>\n<p>Der Prozedur &uuml;bergeben Sie au&szlig;erdem noch die ID der zu l&ouml;schenden Aufgabe. Ist <b>bolLoeschen <\/b>nun <b>False<\/b>, was geschieht, wenn das Element einfach in den leeren Bereich gezogen wird, fragt die Prozedur nach, ob die Aufgabe gel&ouml;scht werden soll. Falls <b>bolLoeschen <\/b>den Wert <b>True <\/b>hat, wird direkt gel&ouml;scht.<\/p>\n<p>Zur&uuml;ck zur Prozedur <b>objTasks_OLEDragDrop <\/b>und zu dem Fall, dass das Element auf ein anderes Element gezogen wurde. Dann liest die Prozedur zun&auml;chst den <b>Key <\/b>des Zielelements in die Variable <b>strKeyDrop <\/b>ein und die ID der entsprechenden Aufgabe in die Variable <b>lngKeyDrop<\/b>. Um einfacher auf das gezogene Element zugreifen zu k&ouml;nnen, wird dieses mit der Objektvariablen <b>objKeyDrag <\/b>referenziert.<\/p>\n<p>Hier erfolgt nun zun&auml;chst die Pr&uuml;fung, ob das Element auf sich selbst gezogen wurde. Dies w&uuml;rde einen Zirkelbezug und damit einen Fehler ausl&ouml;sen, also wird die Prozedur ohne weitere Aktionen beendet. Anderenfalls wird wiederum gepr&uuml;ft, ob der Benutzer die Umschalttaste gedr&uuml;ckt h&auml;lt (<b>Shift = 1<\/b>).<\/p>\n<p><b>Aufgaben zusammenf&uuml;hren<\/b><\/p>\n<p>Wozu aber soll dies gut sein Nun: Das Kopieren von Aufgaben ist wenig sinnvoll, da eine Aufgabe immer nur im Kontext einer &uuml;bergeordneten Aufgabe stehen und nicht mehrfach vorkommen soll.<\/p>\n<p>Es kann aber vorkommen, dass man feststellt, dass man Aufgaben mehrfach anlegt und pflegt. Um sp&auml;ter in Auswertungen vern&uuml;nftige Daten zu erhalten, m&uuml;ssen diese parallel gepflegten Aufgaben zusammengef&uuml;hrt werden. Dies erledigen Sie, wenn Sie eine Aufgabe bei gedr&uuml;ckter Umschalttaste auf eine andere Aufgabe ziehen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die gezogene Aufgabe wird gel&ouml;scht.<\/li>\n<li class=\"aufz-hlung\">Die Unteraufgaben der gezogenen Aufgabe werden der Zielaufgabe untergeordnet.<\/li>\n<li class=\"aufz-hlung\">Die T&auml;tigkeiten, die bereits f&uuml;r die gezogene Aufgabe angelegt wurden, werden ebenfalls der Zielaufgabe untergeordnet.<\/li>\n<\/ul>\n<p>All dies erledigt die Prozedur <b>AufgabenZusammenfuehren <\/b>mit drei SQL-Statements (siehe Klassenmodul des Formulars <b>frmTagesablauf <\/b>in der Beispieldatenbank).<\/p>\n<p><b>Aufgaben verschieben<\/b><\/p>\n<p>Bleibt noch das eigentliche Verschieben, das durch blo&szlig;es Drag and Drop ohne jegliche Tastenkombination erfolgt. Dies f&uuml;hrt zum Aufruf der Prozedur <b>AufgabeVerschieben <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-59-anchor\">Listing 5<\/a><\/span>). Diese Prozedur erwartet die Prim&auml;rschl&uuml;sselwerte der beiden beteiligten Aufgaben als Parameter.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Verschieben einer Aufgabe<\/p>\n<pre>Private Sub AufgabeVerschieben(lngKeydrop As Long, lngKeyDrag As Long)\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    If lngKeydrop = 0 Then\r\n        db.Execute &quot;DELETE FROM tblAufgabenUnteraufgaben WHERE UnteraufgabeID = &quot; _\r\n            &amp; lngKeyDrag, dbFailOnError\r\n    Else\r\n        db.Execute &quot;UPDATE tblAufgabenUnteraufgaben SET AufgabeID = &quot; &amp; lngKeydrop _\r\n            &amp; &quot; WHERE UnteraufgabeID = &quot; &amp; lngKeyDrag, dbFailOnError\r\n        If db.RecordsAffected = 0 Then\r\n            db.Execute &quot;INSERT INTO tblAufgabenUnteraufgaben(AufgabeID, UnteraufgabeID) VALUES(&quot; _\r\n                &amp; lngKeydrop &amp; &quot;, &quot; &amp; lngKeyDrag &amp; &quot;)&quot;, dbFailOnError\r\n        End If\r\n    End If\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Die erste <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob die Aufgabe auf eine Aufgabe mit dem Prim&auml;rschl&uuml;sselwert <b>0 <\/b>gezogen wurde. Die gibt es nat&uuml;rlich gar nicht, aber das Root-Element des Aufgabenbaums hat den Key <b>t0<\/b>.<\/p>\n<p>Damit ein Element direkt unterhalb dieses Elements angezeigt wird, darf es keine &uuml;bergeordnete Aufgabe besitzen. Die entsprechende <b>AufgabeID <\/b>darf also nicht im Feld <b>UnteraufgabeID <\/b>der Tabelle <b>tblAufgabenUnteraufgaben <\/b>vorkommen. Um dies zu erreichen, werden schlicht alle Datens&auml;tze aus dieser Tabelle gel&ouml;scht, die diese Bedingung erf&uuml;llen.<\/p>\n<p>Falls die Aufgabe nicht auf das Root-Element, sondern auf eine echte Aufgabe gezogen wurde, versucht die Prozedur zun&auml;chst, einen eventuell vorhandenen Eintrag in der Tabelle <b>tblAufgabenUnteraufgaben <\/b>umzubiegen. Ist keiner vorhanden, war die gezogene Aufgabe wohl zuvor direkt dem Root-Element untergeordnet und es muss ein neuer Eintrag in der Tabelle <b>tblAufgabenUnteraufgaben <\/b>angelegt werden.<\/p>\n<p><b>Heutige Aufgaben anlegen<\/b><\/p>\n<p>Wenn der Benutzer eine Aufgabe aus dem TreeView in die Liste der heutigen Aufgaben zieht, soll dort ein Eintrag f&uuml;r die entsprechende Aufgabe angelegt werden. Au&szlig;erdem soll die Eigenschaft <b>HeuteZuErledigen <\/b>auf den Wert <b>True <\/b>eingestellt werden.<\/p>\n<p>Beides erledigt die Ereignisprozedur <b>objDailyTasks_OLEDragDrop<\/b>, die beim Fallenlassen einer Aufgabe im ListView-Steuerelement <b>lvwDailyTasks <\/b>ausgel&ouml;st wird (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 6<\/a><\/span>). Die Prozedur liest den Wert des Parameters <b>Data <\/b>ein und ermittelt &uuml;ber den ersten Buchstaben des enthaltenen Ausdrucks die Herkunft des gezogenen Elements. Lautet dieser Buchstabe <b>t<\/b>, wurde eine Aufgabe aus dem TreeView in die Liste gezogen. In diesem Fall wird die Eigenschaft <b>HeuteZuErledigen <\/b>dieser Aufgabe auf <b>True <\/b>eingestellt. Das anschlie&szlig;ende Neuf&uuml;llen des Listenfeldes f&uuml;hrt zum Anzeigen des neuen Eintrags.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Heutige Aufgaben anlegen und entfernen<\/p>\n<pre>Private Sub objDailyTasks_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, _\r\n        Button As Integer, Shift As Integer, x As Single, y As Single)\r\n    Dim strData As String\r\n    Dim strDatatype As String\r\n    Dim lngKeyDrag As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    strData = Data.GetData(ccCFText)\r\n    strDatatype = Left(strData, 1)\r\n    lngKeyDrag = Mid(strData, 2)\r\n    Select Case strDatatype\r\n        Case &quot;t&quot;\r\n            db.Execute &quot;UPDATE tblAufgaben SET HeuteErledigen = True WHERE AufgabeID = &quot; _\r\n                &amp; lngKeyDrag, dbFailOnError\r\n        Case &quot;d&quot;\r\n            If objDailyTasks.HitTest(x, y) Is Nothing Then\r\n                db.Execute &quot;UPDATE tblAufgaben SET HeuteErledigen = False WHERE AufgabeID = &quot; _\r\n                    &amp; lngKeyDrag, dbFailOnError\r\n            End If\r\n    End Select\r\n    FillDailyTasks\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Es gibt jedoch noch eine zweite Variante: Der Benutzer kann auch einen vorhandenen Eintrag in den leeren Bereich des ListView-Steuerelements ziehen, um diesen aus der Liste zu entfernen. Das bedeutet, dass der Parameter <b>Data <\/b>einen mit dem Buchstaben <b>d <\/b>beginnenden Eintrag liefert. Die Prozedur pr&uuml;ft dann noch, ob der Eintrag tats&auml;chlich auf den leeren Bereich gezogen wurde (<b>objDailyTasks.Hittext(x,y) Is Nothing<\/b>), und stellt die Eigenschaft <b>HeuteZuErledigen <\/b>der Aufgabe auf den Wert <b>False <\/b>ein. Nach der Aktualisierung verschwindet dieser Eintrag aus der Liste.<\/p>\n<p><b>T&auml;tigkeiten anlegen<\/b><\/p>\n<p>Das Listenfeld <b>lvwTimeplan <\/b>bietet einige Drag-and-Drop-M&ouml;glickeiten, die in der Ereignisprozedur <b>objTimeplan_OLEDragDrop <\/b>abgearbeitet werden (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-61-anchor\">Listing 7<\/a><\/span>). Auch diese Prozedur speichert den Wert des Parameters <b>Data<\/b>, der Informationen &uuml;ber das gezogene Element liefert, in der Variablen <b>strData<\/b>. Aus dieser wird der erste Buchstabe als Kennzeichen f&uuml;r das Herkunftssteuerelement in der Variablen <b>strDatatype <\/b>gespeichert. Die ID des Elements landet in der Variablen <b>lngKeyDrag<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 7: T&auml;tigkeiten anlegen und verschieben<\/p>\n<pre>Private Sub objTimeplan_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, _\r\n        Button As Integer, Shift As Integer, x As Single, y As Single)\r\n    ''... Variablendeklaration\r\n    Set db = CurrentDb\r\n    strData = Data.GetData(ccCFText)\r\n    strDatatype = Left(strData, 1)\r\n    lngKeyDrag = Mid(strData, 2)\r\n    Set objDrop = objTimeplan.HitTest(x, y)\r\n    If objDrop Is Nothing Then\r\n        Exit Sub\r\n    End If\r\n    strKeyDrop = objDrop.Key\r\n    lngKeydrop = Mid(strKeyDrop, 2)\r\n    Select Case strDatatype\r\n        Case &quot;t&quot; ''from tvwTasks\r\n            Set objDrag = objTasks.Nodes(strData)\r\n            objDrop.ListSubItems(1).Text = objDrag.Text\r\n        Case &quot;d&quot; ''from lvwDailyTasks\r\n            Set objDrag = objDailyTasks.ListItems(strData)\r\n            objDrop.ListSubItems(1).Text = objDrag.Text\r\n        Case &quot;p&quot; ''from lvwTimeplan\r\n            Set objDrag = objTimeplan.ListItems(strData)\r\n            If strKeyDrop = strKeyDrag Then\r\n                Exit Sub\r\n            End If\r\n            lngKeyDrag = Nz(DLookup(&quot;AufgabeID&quot;, &quot;tblTaetigkeiten&quot;, &quot;TaetigkeitID = &quot; &amp; objDrag.Tag))\r\n            If Not IsNull(lngKeyDrag) Then\r\n                objDrop.ListSubItems(1).Text = objDrag.ListSubItems(1).Text\r\n                If Shift = 0 Then ''verschieben\r\n                    db.Execute &quot;DELETE FROM tblTaetigkeiten WHERE Taetigkeitdatum = &quot; _\r\n                        &amp; ISODatum(Me!txtDatum) &amp; &quot; AND Taetigkeitzeit = &quot; _\r\n                        &amp; ISODatum(objDrag.Text), dbFailOnError\r\n                        objDrag.ListSubItems(1).Text = &quot;&quot;\r\n                End If\r\n            End If\r\n    End Select\r\n    objDrop.Tag = AddTaskToTimeplan(lngKeyDrag, Me!txtDatum, objDrop.Text)\r\n    If Not objDrag Is Nothing Then objDrag.Selected = False\r\n    Set objTimeplan.DropHighlight = Nothing\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Danach folgt eine Pr&uuml;fung, ob ein bestehender Listeneintrag als Ziel der Drag-and-Drop-Operation verwendet wurde. Falls nicht, wird die Prozedur beendet. Falls doch, sammelt die Prozedur die Informatoinen &uuml;ber das Zielelement in den Variablen <b>strKeyDrop <\/b>und <b>lngKeyDrop<\/b>. <b>lngKeyDrop <\/b>entspricht dabei der Position des Zieleintrags.<\/p>\n<p>Zeigt das ListView-Steuerelement <b>8:00 <\/b>als ersten Eintrag an und zieht der Benutzer eine Aufgabe auf diesen Eintrag, erh&auml;lt <b>lngKeyDrop <\/b>beispielsweise den Wert <b>1<\/b>.<\/p>\n<p>Danach folgt eine <b>Select Case<\/b>-Bedingung, die je nach der Herkunft des gezogenen Elements verschiedene Aktionen durchf&uuml;hrt.<\/p>\n<p>Kommt das Element vom Aufgaben-TreeView, wird das Element referenziert und sein Text in die zweite Spalte des Zielelements geschrieben. Gleiches gilt, wenn das Element von der Liste der heutigen Aufgaben auf die T&auml;tigkeitsliste gezogen wurde. Etwas komplizierter wird es, wenn der Benutzer einen Eintrag der T&auml;tigkeitsliste auf einen anderen Eintrag der T&auml;tigkeitsliste gezogen hat. In diesem Fall pr&uuml;ft die Prozedur zun&auml;chst, ob der Eintrag auf sich selbst gezogen wurde, und beendet gegebenenfalls die Prozedur.<\/p>\n<p>Anderenfalls liest sie mit einer <b>DLookup<\/b>-Anweisung die <b>AufgabeID <\/b>ein, auf welcher die gezogene T&auml;tigkeit basiert. Ist diese nicht Null, stellt die Prozedur den Text des Zielelements auf den Text des Quellelements ein. Nun kommt es noch darauf an, ob das Element bei gedr&uuml;ckter <b>Strg<\/b>-Taste gezogen wurde. Falls ja, soll das Element kopiert werden, falls nein, wird es verschoben. Ersteren Fall h&auml;tten wir bereits erledigt: Das bestehende Element ist noch vorhanden, das neue Element wurde angelegt. Wenn das Element verschoben werden soll, m&uuml;ssen wir das gezogene Element also noch l&ouml;schen. Dies erledigt die Prozedur mit einer entsprechenden DELETE-SQL-Anweisung. Au&szlig;erdem wird der Text des entsprechenden Elements noch geleert.<\/p>\n<p>Sicher ist Ihnen aufgefallen, dass die beschriebenen Anweisungen dieser Prozedur bislang zwar eine Menge Elemente verschoben und kopiert haben, jedoch wurde nur das innerhalb der T&auml;tigkeitenliste verschobene Element auch in der zugrunde liegenden Tabelle gel&ouml;scht &#8211; und immerhin haben wir in der <b>Select Case<\/b>-Anweisung bereits alle m&ouml;glichen F&auml;lle abgearbeitet.<\/p>\n<p>Dies ist der Fall, weil die Vorgehensweise zum Anlegen einer neuen T&auml;tigkeit im ListView-Steuerelement <b>lvwTimeplan<\/b> f&uuml;r alle Konstellationen gleich erfolgt, und zwar &uuml;ber einen Aufruf der Funktion <b>AddTaskToTimeplan<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-62-anchor\">Listing 8<\/a><\/span>). Diese erwartet die <b>AufgabeID<\/b>, das Datum und die Zeit der neuen T&auml;tigkeit.<\/p>\n<p class=\"listingueberschrift\">Listing 8: T&auml;tigkeit zum Timeplan hinzuf&uuml;gen<\/p>\n<pre>Private Function AddTaskToTimeplan(lngAufgabeID As Long, datTaetigkeitdatum As Date, _\r\n        datTaetigkeitzeit As Date) As Long\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    db.Execute &quot;DELETE FROM tblTaetigkeiten WHERE Taetigkeitdatum = &quot; &amp; ISODatum(datTaetigkeitdatum) _\r\n        &amp; &quot; AND Taetigkeitzeit = &quot; &amp; ISODatum(datTaetigkeitzeit), dbFailOnError\r\n    db.Execute &quot;INSERT INTO tblTaetigkeiten(Taetigkeitdatum, Taetigkeitzeit, Bezeichnung, &quot; _\r\n        &amp; &quot;Beschreibung, AufgabeID, KategorieID, AngelegtAm) SELECT &quot; _\r\n        &amp; ISODatum(datTaetigkeitdatum) &amp; &quot;, &quot; &amp; ISODatum(datTaetigkeitzeit) _\r\n        &amp; &quot;, Aufgabe, Beschreibung, AufgabeID, KategorieID, &quot; _\r\n        &amp; ISODatum(Now) &amp; &quot; AS AngelegtAm FROM tblAufgaben WHERE AufgabeID = &quot; &amp; lngAufgabeID, _\r\n    dbFailOnError\r\n    AddTaskToTimeplan = db.OpenRecordset(&quot;SELECT @@IDENTITY&quot;).Fields(0)\r\nEnd Function<\/pre>\n<p>Sie l&ouml;scht eine eventuell bereits vorhandene T&auml;tigkeit f&uuml;r diese Zeit und legt einen neuen Datensatz in der Tabelle <b>tblTaetigkeiten <\/b>an, wobei die Daten aus dem Datensatz der Tabelle <b>tblAufgaben <\/b>entnommen werden, welcher der &uuml;bergebenen <b>AufgabeID <\/b>entspricht.<\/p>\n<p>Die Funktion gibt die <b>TaetigkeitID <\/b>der neuen T&auml;tigkeit als Funktionswert zur&uuml;ck. Dieser wird der Eigenschaft <b>Tag <\/b>des entsprechenden Eintrags des ListView-Steuerelements <b>lvwTimeplan <\/b>zugewiesen, damit dieser beispielsweise beim L&ouml;schen per Kontextmen&uuml; identifiziert werden kann.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieses komplexe Beispiel zeigt, wie Sie Drag and Drop f&uuml;r Formulare mit mehreren Drag-and-Drop-f&auml;higen Steuerelementen wie ListView- und TreeView-Steuerelementen implementieren k&ouml;nnen. Sie k&ouml;nnen Elemente vom TreeView innerhalb des TreeViews verschieben oder l&ouml;schen oder diese auf die beiden ListView-Steuerelemente ziehen. Damit definieren Sie heute zu erledigende Aufgaben oder die soeben durchgef&uuml;hrten T&auml;tigkeiten.<\/p>\n<p>Grundlagen zu den hier beschriebenen Techniken finden Sie beispielsweise in den Beitr&auml;gen <b>Drag and Drop im TreeView-Steuerelement <\/b>(<b>http:\/\/www.access-im-unternehmen.de\/320<\/b>) oder <b>Drag and Drop mit dem ListView-Steuerelement <\/b>(<b>http:\/\/www.access-im-unternehmen.de\/334<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TagesablaufVerwalten.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{E7B4ED98-5118-4828-964E-715F15463042}\/aiu_833.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie mit ListView- und TreeView-Steuerelementen arbeiten, sind Drag-and-Drop-Operationen ein tolles Hilfsmittel, um Daten zwischen den Steuerelementen hin- und herzuschieben. In der Anwendung aiuTimeplanner gibt es gleich zwei ListView- und ein TreeView-Steuerelement &#8211; gen&uuml;gend M&ouml;glichkeiten also, um Drag and Drop einmal anhand eines Praxisbeispiels zu demonstrieren. Dabei sollen Aufgaben aus dem TreeView in beide ListViews verschoben werden sowie von ListView zu Listview &#8211; und das Verschieben und Kopieren von Eintr&auml;gen innerhalb eines ListView-Steuerelements ist ebenfalls gefragt.<\/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":[662012,66032012,44000027],"tags":[],"class_list":["post-55000833","post","type-post","status-publish","format-standard","hentry","category-662012","category-66032012","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Drag and Drop mit TreeView und ListView - 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\/Drag_and_Drop_mit_TreeView_und_ListView\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Drag and Drop mit TreeView und ListView\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie mit ListView- und TreeView-Steuerelementen arbeiten, sind Drag-and-Drop-Operationen ein tolles Hilfsmittel, um Daten zwischen den Steuerelementen hin- und herzuschieben. In der Anwendung aiuTimeplanner gibt es gleich zwei ListView- und ein TreeView-Steuerelement - gen&uuml;gend M&ouml;glichkeiten also, um Drag and Drop einmal anhand eines Praxisbeispiels zu demonstrieren. Dabei sollen Aufgaben aus dem TreeView in beide ListViews verschoben werden sowie von ListView zu Listview - und das Verschieben und Kopieren von Eintr&auml;gen innerhalb eines ListView-Steuerelements ist ebenfalls gefragt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:54:22+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2\" \/>\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\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Drag and Drop mit TreeView und ListView\",\"datePublished\":\"2020-05-22T21:54:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/\"},\"wordCount\":2922,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c6c1b04f5fa342aca39980f29180f5a2\",\"articleSection\":[\"2012\",\"3\\\/2012\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/\",\"name\":\"Drag and Drop mit TreeView und ListView - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c6c1b04f5fa342aca39980f29180f5a2\",\"datePublished\":\"2020-05-22T21:54:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c6c1b04f5fa342aca39980f29180f5a2\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/c6c1b04f5fa342aca39980f29180f5a2\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Drag_and_Drop_mit_TreeView_und_ListView\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Drag and Drop mit TreeView und ListView\"}]},{\"@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":"Drag and Drop mit TreeView und ListView - 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\/Drag_and_Drop_mit_TreeView_und_ListView\/","og_locale":"de_DE","og_type":"article","og_title":"Drag and Drop mit TreeView und ListView","og_description":"Wenn Sie mit ListView- und TreeView-Steuerelementen arbeiten, sind Drag-and-Drop-Operationen ein tolles Hilfsmittel, um Daten zwischen den Steuerelementen hin- und herzuschieben. In der Anwendung aiuTimeplanner gibt es gleich zwei ListView- und ein TreeView-Steuerelement - gen&uuml;gend M&ouml;glichkeiten also, um Drag and Drop einmal anhand eines Praxisbeispiels zu demonstrieren. Dabei sollen Aufgaben aus dem TreeView in beide ListViews verschoben werden sowie von ListView zu Listview - und das Verschieben und Kopieren von Eintr&auml;gen innerhalb eines ListView-Steuerelements ist ebenfalls gefragt.","og_url":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:54:22+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2","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\/Drag_and_Drop_mit_TreeView_und_ListView\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Drag and Drop mit TreeView und ListView","datePublished":"2020-05-22T21:54:22+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/"},"wordCount":2922,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2","articleSection":["2012","3\/2012","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/","url":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/","name":"Drag and Drop mit TreeView und ListView - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2","datePublished":"2020-05-22T21:54:22+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/c6c1b04f5fa342aca39980f29180f5a2"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Drag_and_Drop_mit_TreeView_und_ListView\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Drag and Drop mit TreeView und ListView"}]},{"@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\/55000833","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=55000833"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000833\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}