
Si permites drag & drop en un treeview puede que no quieras que un nodo raíz pueda arrastrarse a otro nivel. Por ejemplo, si rellenas el control con Departamentos y sus empleados no querrás que se pueda poner un departamento bajo un empleado.
Para evitar que esto suceda puedes usar el evento OLEStartDrag para hacer una validación. Por ejemplo, examinar la propiedad Parent te da una forma sencilla de saber si el nodo es raíz. Como sabes la propiedad Parent devuelve el nodo "padre" de uno dado. Si esta propiedad es Nothing significa que dicho nodo es un nodo raíz.
Ejemplo :
Option Explicit
Public dragNode As Node, hilitNode As Node
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, _
x As Single, y As Single)
Set dragNode = TreeView1.HitTest(x, y)
End Sub
Private Sub TreeView1_OLEStartDrag(Data As MSComctlLib.DataObject, _
AllowedEffects As Long)
If dragNode.Parent Is Nothing Then Set dragNode = Nothing
End Sub
Luego en los eventos OLEDragOver y OLEDragDrop :
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)
If Not dragNode Is Nothing Then
TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End If
End Sub

