TreeView-Steuerelemente enthalten gelegentlich mehr Einträge, als gleichzeitig dargestellt werden können. Dank der Bildlaufleisten ist das kein Problem. Wenn Sie jedoch mit Drag and Drop arbeiten und einen Eintrag an eine Stelle verschieben möchten, die aktuell nicht sichtbar ist, stehen Sie auf dem Schlauch: Scrolling während Drag and Drop wird vom TreeView-Steuerelement nicht unterstützt. Mit diesem Beitrag rüsten wir dieses Feature nach.
Das TreeView-Steuerelement bietet schon eine Menge Features, aber an das Scrolling beim Ziehen von Elementen bis an den oberen oder unteren Rand heran hat man wohl nicht gedacht. Zum Glück gibt es Möglichkeiten, dieses Feature nachzurüsten. Die Prozedur aus Bild 1).
Listing 1: Füllen und Anpassen des TreeView-Steuerelements
Private Sub Form_Load() Dim i As Integer Dim j As Integer Dim objNode As MSComctlLib.Node Set objTreeView = Me!tvwScrolling.Object With objTreeView .Appearance = ccFlat .BorderStyle = ccNone .Font.Name = "Calibri" .Font.Size = "9" .LineStyle = tvwRootLines .OLEDragMode = ccOLEDragAutomatic .OLEDropMode = ccOLEDropManual End With For i = 1 To 10 Set objNode = objTreeView.Nodes.Add(, , "a" & i, "Element " & i) objNode.Expanded = True For j = 1 To 10 Set objNode = objTreeView.Nodes.Add("a" & i, tvwChild, "a" & i & "_" & j, _ "Element " & i & "_" & j) Next j Next i End Sub
Bild 1: TreeView-Steuerlement mit Testeinträgen
Damit wir die Ereignisse des TreeView-Steuerelements implementieren können, speichern wir einen Objektverweis in einer modulweit deklarierten Variable:
Dim WithEvents objTreeView As MSComctlLib.TreeView
Nach diesen Vorbereitungen stellt sich nun die Frage, wie sich das Scrollen realisieren lässt.
Dieses Problem lässt sich in zwei kleinere Probleme aufteilen: Wie bewegen wir das TreeView-Steuerelement dazu, seinen Inhalt zu scrollen und wie sorgen wir dafür, dass dies genau dann geschieht, wenn ein Element per Drag and Drop an den oberen beziehungsweise unteren Rand geführt wird