Rubrik: Maus & Tastatur · Drag & Drop | VB-Versionen: VB5, VB6 | 20.02.02 |
![]() Dieses Beispiel zeigt, wie man eine Drag & Drop Funktion von Node-Objekten innerhalb eines TreeView-Controls realisiert. | ||
Autor: ![]() | Bewertung: ![]() ![]() ![]() ![]() ![]() | Views: 43.715 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | ![]() |
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