Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

TreeView Control - Nodes verschieben, Drag&Drop

Forumthread: TreeView Control - Nodes verschieben, Drag&Drop

TreeView Control - Nodes verschieben, Drag&Drop
17.08.2003 18:12:34
Michael Brüggemann
Liebe Spezialisten,
bis hierher habe ich mich mit dem TreeView Control noch durchgefummelt (anlegen und löschen von Knoten).
Nunmehr möchte ich jedoch bereits angelegte Knoten verschieben, sei es über den Klick auf einen "nach unten" oder "nach oben" Button, sei es über Drag & Drop.
Meine Recherche in diesem Forum ergab bisher leider nur sehr geringe Informationen und es scheint (laut Hans himself), dass in VBA Drag&Drop mit dem TreeView Control nicht möglich ist.
Hier also meine Fragen:
1.
Ist Drag & Drop mit VBA und dem TreeView Control möglich ? Wenn ja, wie (hat jemand von Euch so etwas schon programmiert) ?
2.
Wie verschiebe ich Knoten innerhalb eines Baumes ? Muss ich mir die Attribute des Knotens vielleicht sogar merken, den Knoten löschen und an der neuen Position wieder hinzufügen ?
Danke für jede Idee und Erfahrung
Michael
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: TreeView Control - Nodes verschieben, Drag&Drop
17.08.2003 19:04:55
Jochen
Hallo,
meinst du so wie im Explorer einen Ordner verschieben?
Gruß Jochen

AW: TreeView Control - Nodes verschieben, Drag&Drop
17.08.2003 21:33:13
Michael Brüggemann
Hallo Jochen,
genau darauf will ich hinaus. Das Objekt TreeView gibt das her. Ich habe jedoch bis jetzt keine Quelle gefunden, die das Handling in VBA beschreibt.
Michael

AW: TreeView Control - Nodes verschieben, Drag&Drop
17.08.2003 22:04:12
Jochen
Hallo,
Welches Ereignis im TreeView soll das deiner Meinung nach hergeben?
Gruß Jochen

Anzeige
AW: TreeView Control - Nodes verschieben, Drag&Drop
17.08.2003 23:07:53
Michael Brüggemann
Hallo Jochen,
hier ein Beispiel aus der Hilfedatei zu den MS Common Controls. Danach sind Ereignisse und Methoden vorgesehen, jedoch offensichtlich mit VBA nicht benutzbar:
' Declare global variables.
Dim indrag As Boolean ' Flag that signals a Drag Drop operation.
Dim nodX As Object ' Item that is being dragged.

Private Sub Form_Load()
' Load a bitmap into an Imagelist control.
Dim imgX As ListImage
Dim BitmapPath As String
BitmapPath = "icons\mail\mail01a.ico"
Set imgX = ImageList1.ListImages.Add(, , LoadPicture(BitmapPath))
' Initialize TreeView control and create several nodes.
TreeView1.ImageList = ImageList1
Dim nodX As Node      ' Create a tree.
Set nodX = TreeView1.Nodes.Add(, , , "Parent1", 1)
Set nodX = TreeView1.Nodes.Add(, , , "Parent2", 1)
Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Child 1", 1)
Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Child 2", 1)
Set nodX = TreeView1.Nodes.Add(2, tvwChild, , "Child 3", 1)
Set nodX = TreeView1.Nodes.Add(2, tvwChild, , "Child 4", 1)
Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Child 5", 1)
nodX.EnsureVisible ' Expand tree to show all nodes.
End Sub


Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Set nodX = TreeView1.SelectedItem ' Set the item being dragged.
Set TreeView1.DropHighlight = Nothing
End Sub


Private Sub TreeView1_MouseMove _
(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then ' Signal a Drag operation.
indrag = True ' Set the flag to true.
' Set the drag icon with the CreateDragImage method.
TreeView1.DragIcon = TreeView1.SelectedItem.CreateDragImage
TreeView1.Drag vbBeginDrag ' Drag operation.
End If
End Sub


Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
' If user didn't move mouse or released it over an invalid area.
If TreeView1.DropHighlight Is Nothing Then
indrag = False
Exit Sub
Else
' Set dragged node's parent property to the target node.
On Error GoTo checkerror ' To prevent circular errors.
Set nodX.Parent = TreeView1.DropHighlight
Cls
Print TreeView1.DropHighlight.Text & _
" is parent of " & nodX.Text
' Release the DropHighlight reference.
Set TreeView1.DropHighlight = Nothing
indrag = False
Exit Sub ' Exit if no errors occured.
End If
checkerror:
' Define constants to represent Visual Basic errors code.
Const CircularError = 35614
If Err.Number = CircularError Then
Dim msg As String
msg = "A node can't be made a child of its own children."
' Display the message box with an exclamation mark icon
' and with OK and Cancel buttons.
If MsgBox(msg, vbExclamation & vbOKCancel) = vbOK Then
' Release the DropHighlight reference.
indrag = False
Set TreeView1.DropHighlight = Nothing
Exit Sub
End If
End If
End Sub


Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End Sub

CIAO
Michael

Anzeige
AW: TreeView Control - Nodes verschieben, Drag&Drop
18.08.2003 00:02:40
Jochen
Hallo,
ich wüßte auf den ersten Blick nicht, warum das in VBA nicht gehen sollte.
Der Code setzt eine Imagelist voraus, die ebenfalls aus den Common- Controls
ist und auch in VBA genutzt werden kann.
Das Einzige was es in VBA nicht gibt, ist das Form_load, was aber durch
UserForm_Initialize ersetzt werden kann.
Gruß Jochen

Anzeige
AW: TreeView Control - Nodes verschieben, Drag&Drop
18.08.2003 02:48:12
Jochen
Hallo,
nach etwas genauerem Hinschauen sind da doch einige sachen, die in
VBA nicht gehen: z.B. dragicon, drag, print, cls sind nur in VB
verfügbar.
Gruß Jochen

;
Anzeige

Infobox / Tutorial

Knoten im TreeView Control mit VBA verschieben


Schritt-für-Schritt-Anleitung

Um Knoten im TreeView Control mit VBA zu verschieben, kannst Du die folgenden Schritte befolgen:

  1. TreeView Control erstellen: Stelle sicher, dass Du ein TreeView Control in Deiner UserForm hast.

  2. Knoten hinzufügen: Verwende den folgenden Code, um Knoten zu erstellen:

    Dim nodX As Node
    Set nodX = TreeView1.Nodes.Add(, , , "Parent1", 1)
    Set nodX = TreeView1.Nodes.Add(, , , "Child 1", 1)
  3. Drag & Drop-Ereignisse einrichten: Implementiere die Drag & Drop-Funktionalität mit den folgenden Ereignissen:

    • MouseDown: Setze den Knoten, der gezogen wird.
    • MouseMove: Initiere die Drag-Operation.
    • DragOver: Bestimme den Zielknoten.
    • DragDrop: Verschiebe den Knoten an die neue Position.

    Hier ein Beispiel:

    Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
       Set nodX = TreeView1.SelectedItem
    End Sub
    
    Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
       If Button = vbLeftButton Then
           TreeView1.Drag vbBeginDrag
       End If
    End Sub
    
    Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
       Set nodX.Parent = TreeView1.DropHighlight
    End Sub
  4. Ereignisse anpassen: Achte darauf, dass Du Fehlerbehandlungen einbaust, um z.B. zirkuläre Referenzen zu vermeiden.


Häufige Fehler und Lösungen

  • Drag & Drop funktioniert nicht: Überprüfe, ob die Ereignisse korrekt verbunden sind. In VBA gibt es einige Einschränkungen, die in Visual Basic nicht vorhanden sind.
  • Knoten werden nicht verschoben: Stelle sicher, dass der Zielknoten gültig ist und dass der Knoten nicht zu einem seiner eigenen Kinder gemacht wird.
  • Fehlermeldungen: Implementiere eine Fehlerbehandlung, um spezifische Probleme zu diagnostizieren.

Alternative Methoden

Wenn Drag & Drop nicht die gewünschte Funktionalität bietet, kannst Du auch Buttons verwenden, um Knoten nach oben oder unten zu verschieben:

  • Nach oben: Ändere die Position des Knotens über den Move-Befehl.
  • Nach unten: Ähnlich wie beim Nach-oben-Button, aber die Position wird entsprechend angepasst.
Sub MoveNodeUp()
    ' Code zum Verschieben des Knotens nach oben
End Sub

Sub MoveNodeDown()
    ' Code zum Verschieben des Knotens nach unten
End Sub

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du Knoten im TreeView Control verwalten kannst:

Private Sub MoveNodeUp_Click()
    If Not nodX Is Nothing Then
        If Not nodX.Index = 1 Then
            nodX.Move nodX.Index - 1
        End If
    End If
End Sub

Private Sub MoveNodeDown_Click()
    If Not nodX Is Nothing Then
        If Not nodX.Index = TreeView1.Nodes.Count Then
            nodX.Move nodX.Index + 1
        End If
    End If
End Sub

In diesem Fall kannst Du Buttons in Deiner UserForm hinzufügen, um die oben genannten Subroutinen zu verwenden.


Tipps für Profis

  • Verwendung von Imagelists: Nutze Imagelists für eine ansprechendere Darstellung Deiner Knoten.
  • Optimierung der Performance: Bei großen Datenmengen kann es sinnvoll sein, den TreeView vorübergehend zu aktualisieren, um die Performance zu verbessern.
  • Erweiterte Fehlerbehandlung: Implementiere umfassende Fehlerbehandlungen, um die Benutzererfahrung zu verbessern.

FAQ: Häufige Fragen

1. Ist Drag & Drop mit dem TreeView Control in VBA möglich? Ja, Drag & Drop ist möglich, aber es erfordert eine sorgfältige Implementierung der Ereignisse.

2. Warum funktioniert das Drag & Drop nicht wie erwartet? Es könnte an den Einschränkungen von VBA liegen. Überprüfe Deine Ereignisimplementierungen und die Struktur Deiner Knoten.

3. Wie kann ich sicherstellen, dass keine zirkulären Knoten erstellt werden? Implementiere eine Fehlerbehandlung, die zirkuläre Referenzen erkennt und entsprechend behandelt.

4. Welche Version von Excel benötige ich für das TreeView Control? Das TreeView Control ist in Excel 2000 und höheren Versionen verfügbar.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige