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 Dieser Tipp wurde bereits 18.275 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) |
||||||||||||||||
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. |