Hi,
klar das das so nicht geht. Du verschiebst das Node nämlich nicht, sendern erstellst ein neues Node Objekt, mit den Daten deines bereits existierenden Node Objektes. Dabei kopierst du auch den .Key. Das geht so nicht. Unabhängig von der Position eines Nodes muss der jeweilige Key immer eindeutig sein.
Hier ist ein Weg für Drag&Drop in einem TreeView
Option Explicit
Private Sub Form_Load()
Dim i As Long
Dim ii As Long
Dim iii As Long
With Me.TreeView1
For i = 1 To 5
.Nodes.Add , tvwFirst, "MainNode_" & i, "MainNode_" & i
For ii = 1 To 10
Me.TreeView1.Nodes.Add "MainNode_" & i, _
tvwChild, "Child_" & i & "_" & ii, "Child_" & i & "_" & ii
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()
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, das 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
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 Gruß
Tolwyn |