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

https://www.vbarchiv.net
Rubrik: Controls · TreeView   |   VB-Versionen: VB5, VB611.10.05
TreeView: NodeCheck verhindern

Mit einem kleinen Trick lässt sich das Aktivieren der CheckBox für bestimmte Node-Einträge im TreeView-Control verhindern.

Autor:   Dieter OtterBewertung:  Views:  18.278 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Benutzt man ein TreeView-Control mit integrierter CheckBox, lässt sich das Aktivieren der CheckBox durch den Anwender für bestimmte Node-Elemente leider nicht so ohne Weiteres verhindern. Soll bspw. der erste Node-Eintrag (Root-Node) immer anghakt sein, müssen wir einen kleinen Trick anwenden, damit der Anwender das Häkchen nicht entfernen kann.

Beim Klick auf die CheckBox eines Node-Eintrags löst das TreeView-Control das NodeCheck-Ereignis aus. Hier kann über den Node-Parameter das Node-Objekt abgefragt werden, jedoch nicht verhindert werden, dass der Status der CheckBox geändert wird.

Um den Status des Node-Objekts nach der Status-Änderung wieder auf den gewünschten "Ursprungs-Zustand" zurückzusetzen, benötigen wir ein Timer-Control mit einer kurzen Intervall-Einstellung. Beim Klick auf die CheckBox aktivieren wir den Timer und setzen den Status im Timer-Event einfach wieder zurück.

Erstellen Sie ein neues Projekt und platzieren auf die Form ein Timer-Control, sowie ein TreeView-Control. Fügen Sie nachfolgenden Code in den Codeteil der Form ein.

Option Explicit
 
Private Sub Form_Load()
  ' TreeView füllen
  TreeView1.Checkboxes = True
  With TreeView1.Nodes
    .Add , , "root", "Root"
    .Add "root", tvwChild, , "Eintrag 1"
    .Add "root", tvwChild, , "Eintrag 2"
    .Add "root", tvwChild, , "Eintrag 3"
  End With
 
  ' Root-Node öffnen und CheckBox aktivieren
  With TreeView1.Nodes(1)
    .Checked = True
    .Expanded = True
  End With
 
  ' Timer initialisieren
  Timer1.Enabled = False
  Timer1.Interval = 50
End Sub
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
  ' Klick auf die CheckBox des Root-Nodes?
  If Node.Index = 1 Then
    ' Timer starten
    Timer1.Enabled = True
  End If
End Sub
Private Sub Timer1_Timer()
  ' CheckBox des Root-Node-Eintrags zurücksetzen
  Timer1.Enabled = False
  TreeView1.Nodes(1).Checked = True
End Sub

Das Ganze funktioniert soweit ganz gut. Nur leider flackert der Status der CheckBox, was wir aber noch wie folgt abstellen können:

' benötigte API-Deklarationen
Private Declare Function LockWindowUpdate Lib "user32.dll" ( _
  ByVal hWnd As Long) As Long
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, _
  x As Single, y As Single)
 
  ' Neuzeichnen des Control-Inhaltes abschalten
  LockWindowUpdate TreeView1.hWnd
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, _
  x As Single, y As Single)
 
  ' Neuzeichnen des Control-Inhaltes aktivieren, falls
  ' nicht schon das NodeCheck-Ereignis ausgelöst wurde
  If Not Timer1.Enabled Then LockWindowUpdate 0&
End Sub
Private Sub Timer1_Timer()
  ' CheckBox des Root-Node-Eintrags zurücksetzen
  Timer1.Enabled = False
  TreeView1.Nodes(1).Checked = True
 
  ' Neuzeichnen des Control-Inhaltes wieder aktivieren
  LockWindowUpdate 0&
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-2024 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.