Jeder kennt sogenannte "Drag & Drop" - Aktionen, bei denen Elemente entweder innerhalb eines Fensters (Controls) oder von einem Fenster (Control) in ein anderes Fenster (Control) verschoben oder kopiert werden - und das ganze per Klicken und Ziehen mit der Maus. Unser heutiges Beispiel soll Ihnen zeigen, wie sich ein Element innerhalb eines TreeView-Controls (also ein Node-Objekt) per Drag & Drop an eine beliebige andere Position innerhalb der gesamten TreeView-Struktur verschieben lässt. Hierbei soll es keine Rolle spielen, ob es sich bei dem zu verschiebenden Element um ein Parent-Knoten oder ein Child-Knoten handelt. Beim Verschieben des Elements sollen also auch alle dem Element untergeordneten Child-Elemente mit verschoben werden. Um das Beispiel zu testen, erstellen Sie ein neues Projekt und plazieren auf die Form ein TreeView-Control. Fügen Sie anschliessend den nachfolgenden Code in den Codeteil der Form ein. Option Explicit Private Sub Form_Load() Dim i As Long Dim ii As Long Dim iii As Long ' TreeView mit ein paar Parent- und Child- ' Elementen füllen With Me.TreeView1 For i = 1 To 5 ' Hauptknoten (Parent-Nodes) .Nodes.Add , tvwFirst, "MainNode_" & i, _ "MainNode_" & i For ii = 1 To 10 ' Unterkonten (Child-Nodes) Me.TreeView1.Nodes.Add "MainNode_" & i, _ tvwChild, "Child_" & i & "_" & ii, _ "Child_" & i & "_" & ii ' Und Unter-Unterknoten For iii = 1 To 5 Me.TreeView1.Nodes.Add "Child_" & i & "_" & ii, _ tvwChild, "Child_" & i & "_" & ii & "_" & iii, _ "Child_" & i & "_" & ii & "_" & iii Next iii Next ii Next i .OLEDragMode = ccOLEDragAutomatic .OLEDropMode = ccOLEDropManual End With End Sub Private Sub Form_Resize() ' TreeView autom. an der Größe der Form anpassen TreeView1.Height = Me.ScaleHeight - 60 End Sub Private Sub TreeView1_MouseDown(Button As Integer, _ Shift As Integer, x As Single, y As Single) ' Da das OLEStartDrag-Ereignis vor dem NodeClick- ' Ereignis augeführt wird, müssen wir sicherstellen, ' dass auch wirklich das richtige Node selektiert ist. Me.TreeView1.SelectedItem = Me.TreeView1.HitTest(x, y) End Sub Private Sub TreeView1_NodeClick( _ ByVal Node As MSComctlLib.Node) Debug.Print "Node Click " End Sub ' Node-Objekt verschieben Private Sub TreeView1_OLEDragDrop( _ Data As MSComctlLib.DataObject, _ Effect As Long, Button As Integer, Shift As Integer, _ x As Single, y As Single) Dim sTemp As String Dim oNode As MSComctlLib.Node Dim oDragNode As MSComctlLib.Node Set oNode = Me.TreeView1.HitTest(x, y) If Data.GetFormat(vbCFText) Then sTemp = Data.GetData(vbCFText) Set oDragNode = TreeView1.Nodes(sTemp) ' ok nun schaun wir mal wo das Node denn hin soll If oNode.Parent Is Nothing Then ' Wenn über einem Root Node gedroppt wurde, ' das Drop Node einfach in dieses RootNode hängen Set oDragNode.Parent = oNode Else ' ansonsten If oNode.Children > 0 Then ' Wenn das Node Children hat, dann in das ' Node setzten Set oDragNode.Parent = oNode Else ' ansonsten in den Parent des Nodes Set oDragNode.Parent = oNode.Parent End If End If Set TreeView1.DropHighlight = Nothing End If End Sub Private Sub TreeView1_OLEDragOver( _ Data As MSComctlLib.DataObject, _ Effect As Long, Button As Integer, Shift As Integer, _ x As Single, y As Single, State As Integer) With TreeView1 If State = vbLeave Then ' Wenn wir das TreeView verlassen, auch das ' Highlight entfernen Set .DropHighlight = Nothing Else .DropHighlight = .HitTest(x, y) End If End With End Sub Private Sub TreeView1_OLEStartDrag( _ Data As MSComctlLib.DataObject, _ AllowedEffects As Long) Dim oDragNode As MSComctlLib.Node Data.Clear ' Nicht für Root Nodes geeignet If Not Me.TreeView1.SelectedItem.Parent Is Nothing Then Data.SetData Me.TreeView1.SelectedItem.Key, vbCFText End If End Sub Dieser Tipp wurde bereits 43.650 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
TOP! Unser Nr. 1 Neu! sevDataGrid 3.0 Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Tipp des Monats Januar 2025 Dieter Otter Zeilen einer MultiLine-TextBox ermitteln (VB.NET) Dieser Zipp zeigt, wie man die Zeilen einer MultiLine-TextBox exakt so ermitteln kann, wie diese auch in der TextBox dargestellt werden. TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |