treeview node disable

DerStauner

Erfahrenes Mitglied
Tag!

ich brauche einen handfesten, eindeutigen Anhaltspunkt, wie ich ein (oder mehrere) Nodes in einem Treeview disablen kann

ich habe schon alles versucht, seit Tagen hänge ich im Google, fand auch einiges, aber die funktionieren nicht oder sind nur Halbwegslösungen.

Leide hat sich Microsoft in dieser Hinsicht wieder was Falsches gemacht. Warum kann man nicht einfach treeview.nodes(0).nodes(1).Enabled=false oder treeview.nodes(0).visible=false schreiben Das wäre doch das Einfachste. Aber nein.

Bitte um Hilfe.

Danke.
 
Leide hat sich Microsoft in dieser Hinsicht wieder was Falsches gemacht. Warum kann man nicht einfach treeview.nodes(0).nodes(1).Enabled=false oder treeview.nodes(0).visible=false schreiben Das wäre doch das Einfachste. Aber nein.
.
Wieso soll Microsoft daran schuld sein? :confused: Ich kann sowas echt nicht mehr hören und lesen!
Es wäre eher unsinnig, wenn die Klasse diese Propertys hätte. TreeNode ist kein Control. Warum sollte es dann bitte die Propertys Enabled und Visible bieten.

Mir fällt auch beim besten Willen kein UseCase ein, der das erfordert!
Aber vielleicht kannst du ihn nennen?! ;)
 
Das Beispiel:

ich habe eine mdi-Anwendung, wo das Menü ein Treeview darstellt. Nun, es gibt zwei Arten (später noch mehr) der User: ein normaler User und ein Admin. Im Treeview gibt es Nodes, welche nur von normalen Usern und welche auch von Admins erreicht werden können. Wichtig ist dabei, dass die Admins alle Nodes erreichen müssen.

Wenn ein normaler User einloggt, dann sollte er keinen Zugriff auf die Nodes haben, welche nur Admins erreichen können. Hier könnte ich Remove benutzen, aber es ist wichtig, dass diese Nodes angezeigt bleiben. So bleibt hier aus meiner Sicht nur die Lösung, diese Nodes irgendwie zu disablen, damit der normale User sie nicht anklicken bzw. expandieren kann. Und im späteren Verlauf des Programms müssen - abhängig davon, was der User macht - wieder einige Nodes nicht erreichbar sein, aber sie müssen angezeigt bleiben.

Das ist das Beispiel.

Stell dir mal das Ganze vor, wie ein Menüsystem. In einem Menüsystem gibt es auch Elemente, die du gerne disablen möchtest (und sie nicht verschwinden lassen) und einmal wieder auf enabled setzen. DAs ist durchauch ein Anwendungsbereich. Nicht wahr?

Und wenn du im Internet nachschaust, wirst du sehen, dass auch andere diese Problematik gerne gelöst bekommen würden.
 
Zuletzt bearbeitet:
Hi

Nun ja, wenn ein Menü für einen User nicht bestimmt, sollte es im auch nicht angezeigt werden, sprich die Node gar nicht erst in den Baum eingefügt werden!

Bzgl. verhindern von Anklicken:
In den Events BeforeSelect und BeforeExpand, musst du prüfen, ob das aktuell für diese Node angeforderte Ereignis auch erlaubt ist. Wenn nein, setz e.Cancel auf True.

Aber wie gesagt, ich finde das Verhalten aus Usersicht weniger gut!
 
Nun, wieder ein Problem weniger.

Ich poste hier die Lösung:

1. bei allen Nodes, was ich disablen möchte, habe ich in die Tag Eigenschaft "NotSelected" eingegeben und per Code das ForeColor auf SystemColors.ControlDark eingestellt (dies entspricht dem Disabled Style)
2. im Mousedown Event des Treeviews habe ich Folgendes geschrieben:

Code:
NonSelectable=False
Dim info As TreeViewHitTestInfo
info = MainMenuList.HitTest(e.X, e.Y)
If IsNothing(info.Node) Then
       Exit Sub
Else
       If info.Node.Tag = "NotSelected" Then NonSelectable = True
End If

3. Und ich prüfe im BeforeSelect und im BeforeExpand Event Folgendes:

Code:
If NonSelectable Then e.Cancel = True

4. Und wenn ich möchte, dass der User die Nodes anklicken kann, dann prüfe ich der Code noch ein zusätzliches Variable im Mousedown Event: wenn das true ist, dann Exit Sub, wenn false, dann kann der User die Nodes nicht auswählen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück