Newsgroup: it.comp.lang.visual-basic
Titolo: Drag nella treeview

Qualcuno sa dirmi se è possibile gestire il drag & drop dei nodi di una
Treeview per fare in modo di scambiarli di ordine?
Come si fa tranquillamente in Gestione Risorse quando si vuole spostare una
cartella.
Per ora sono solo riuscito a fare il drag tra oggetti diversi ma in questo
caso il controllo treeview è uno solo e devo fare il drag dei nodi al suo
interno, magari che si evidenzino al passaggio del mouse.
Grazie
Maurizio Coffinardi

 ha scritto nel messaggio
news:8vvt6p$j3b$1...@nread1.inwind.it...


 interno, magari che si evidenzino al passaggio del mouse.
Ti ricopio un reply ad un post del mese corso:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OK, ecco un esempietto senza pretese che da' l' idea.
Aggiungi un nuovo form, inserisci una image list ed una treeview.
Lascia stare le proprieta' predefinite, per adesso.
Copia il codice seguente ed esegui.
Ciao
Aldo
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Option Explicit
Private mNode As Node     '// tiene traccia del nodo selezionato
'----------------------------------------------------------------
Private Sub Form_Load()
  Dim n As Long, j As Long, oNode As Node
  '// carica l' image list
  With ImageList1
    .ImageHeight = 16
    .ImageWidth = 16
    With .ListImages
      .Clear
      .Add , "i", Me.Icon
    End With
  End With
  '// carica la treeview, dopo averle assegnato l' image list
  With TreeView1
    Set .ImageList = ImageList1
    With .Nodes
      .Clear
      Set oNode = .Add(, , "Root", "Root")
      oNode.Expanded = True
      For n = 1 To 5
        Set oNode = .Add("Root", tvwChild, "L1_" & n, "Livello " & n & "
Nodo " & n, "i")
        oNode.Expanded = True
      Next n
      For j = 1 To 5
        For n = 1 To 5
          Set oNode = .Add("L1_" & j, tvwChild, "L2_" & j & "_" & n,
"Livello " & n & " Nodo " & j & "/" & n, "i")
          oNode.Expanded = True
        Next n
      Next j
    End With
  End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
  '// rilascia eventuali referenze
  Set mNode = Nothing
End Sub
Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
  '// previene la modifica del testo dei nodi
  Cancel = True
End Sub
Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
  If TreeView1.DropHighlight Is Nothing Then
        Exit Sub
    Else
        On Error GoTo eh
        '// sposta il nodo oggetto del drag
        Set mNode.Parent = TreeView1.DropHighlight
        Set TreeView1.DropHighlight = Nothing
        Set mNode = Nothing
        Exit Sub
    End If
eh:
    Set TreeView1.DropHighlight = Nothing
End Sub
Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single,
State As Integer)
  If Not mNode Is Nothing Then
    '// evidenzia il nodo che si sta "sorvolando"
    Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
  End If
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As
Single, y As Single)
  Dim miNode As Node    '// cache del nodo corrente
  With TreeView1
    '// legge su qual nodo e' il mouse e lo evidenzia
    Set miNode = .HitTest(x, y)
    Set .DropHighlight = miNode
    If Not miNode Is Nothing Then
      If miNode.Key = "Root" Then
        '// se e' il nodo Root allora non fa nulla
        Set mNode = Nothing
      Else
        '// seleziona il nodo corrente
        '// e lo memorizza
        Set .SelectedItem = miNode
        Set mNode = miNode
      End If
    End If
    '// rilascia il drop-highligt
    Set .DropHighlight = Nothing
  End With
End Sub
Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
  On Local Error Resume Next
    If Button = vbLeftButton Then
      If Not mNode Is Nothing Then
        '// ricrea l' immagine del drag
        TreeView1.DragIcon = TreeView1.SelectedItem.CreateDragImage
        TreeView1.Drag vbBeginDrag
      End If
    End If
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
  If Not mNode Is Nothing Then
    Dim miNode As Node
    '// verifica su quale nodo e' arrivato
    Set miNode = TreeView1.HitTest(x, y)
    If Not miNode Is Nothing Then
      '// se il nodo di arrivo e' diverso da quello di partenza
      '//  allora sposta il nodo e termina l' operazione di drag'n'drop
      If Not miNode Is mNode Then
        Set mNode.Parent = miNode
      End If
    End If
    Set TreeView1.DropHighlight = Nothing
    Set mNode = Nothing
  End If
End Sub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ciao
Aldo

 ha scritto nel messaggio
news:90buf5$ithu$1...@ID-56381.news.dfncis.de...
