Rubrik: Controls · TreeView | VB-Versionen: VB5, VB6 | 11.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 Otter | Bewertung: | Views: 18.278 |
www.tools4vb.de | System: 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