vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Maus & Tastatur · Drag & Drop   |   VB-Versionen: VB5, VB620.02.02
Drag & Drop im TreeView-Control

Dieses Beispiel zeigt, wie man eine Drag & Drop Funktion von Node-Objekten innerhalb eines TreeView-Controls realisiert.

Autor:   Thomas BannertBewertung:  Views:  40.920 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

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



Anzeige

Kauftipp Unser Dauerbrenner!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.
 
 
Copyright ©2000-2021 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.