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.276 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. |
sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! 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 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |