Visible-Eigenschaft lässt sich nicht ändern

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Visible-Eigenschaft lässt sich nicht ändern

    Hallo Leute,

    ich habe mal wieder ein kleiners Problem. Und zwar ist es mir nicht möglich die Visible-Eigenschaft von einem ToolStripMenuItem zu ändern.
    Ich habe ein ContextMenu auf meiner Form, dass mehrere Items besitzt.
    Nun möchte ich aber entscheiden, welche Items angezeigt werden und welche nicht.
    Dazu habe ich eine Datenbank mit verschiedenen Parametern für den jeweiligen Nutzer der sich im Programm anmeldet.
    Diese werden auch richtig ausgelesen und in einer Struture gespeichert.
    Anschließend soll der gespeicherte Wert den Visible-Status des ToolStripMenuItems beschreiben.
    Leider ist es nicht mögich.
    Per BreakPoint sehe ich jedesmal, dass die Eigenschaft auf "False" steht, jedoch wird mir das Item im ContextMenu angezeigt.
    Setze ich die Eigenschaft auf "False" bevor ich das Projekt kompiliere, wird das Item dennoch angezeigt.

    Das Item wird nur auf einem Formular verwendet und bearbeitet, also wird der Wert nicht von einem anderen Modul, Formular oder Klasse überschrieben.

    Hat jemand eine Ahnung, wieso sich die Visible-Eigenschaft nicht beeinflussen lässt ?

    Mfg
    Bianco
    .wife {right: 100%; margin: 0;}
    Habe es gerade mit einem neuen Programm probiert, da funktioniert es.

    Contextmenü mit 2 Items erstellt, dazu eine Checkbox.

    Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    2. ContextMenuStrip1.Items(1).Visible = CheckBox1.Checked
    3. End Sub


    Je nachdem, ob die Checkbox an oder aus ist, ist das 2. Item sichtbar oder nicht.

    Was passiert, wenn du es anstatt mit .visible mit .enabled probierst?
    @Theckwolf

    Danke für deine Antwort, aber das es grundsätzlich funktioniert ist mir bekannt:
    Aus diesem Grund stelle ich diese Frage, da ich keine Erklärung finde, warum es sich bei diesem ContextMenu nicht beeinflussen lässt.
    Ich nutze derzeit ca. fünf verschiedene ContextMenuStrips auf diesem Formular.
    Bei zwei von Ihnen ist es nicht möglich per Eigenschaft den Wert zu ändern oder zur Laufzeit zu zuweisen.
    Die restlichen ContextMenuStrips lassen sich ohne Probleme bearbeiten.

    Die Eigenschaft "Enabled" kann bearbeitet werden und übernimmt auch den Wert.
    .wife {right: 100%; margin: 0;}
    hast Du es mal versucht mit:

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    2. If CheckBox2.Checked Then
    3. ContextMenuStrip1.Items(1).Visible = True
    4. End if
    5. End Sub
    ?

    Oder wenn Du mehrere Checkboxen zusammenfassen willst:

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged
    2. Select Case true
    3. Case sender Is CheckBox1
    4. If Checkbox1.Checked Then
    5. ContextMenuStrip1.Items(1).Visible = True
    6. ElseIf Not Checkbox.1.Checked Then
    7. ContextMenuStrip1.Items(1).Visible = False
    8. End If
    9. Case sender Is CheckBox2
    10. ...
    11. End Select
    12. End Sub


    Gruß, Volkmar
    @Bianco Poste Deinen Code.
    Dies funktioniert:

    VB.NET-Quellcode

    1. Private Sub ContextMenuStrip1_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
    2. Item1ToolStripMenuItem.Visible = CheckBox1.Checked
    3. Item2ToolStripMenuItem.Visible = CheckBox2.Checked
    4. Item3ToolStripMenuItem.Visible = CheckBox3.Checked
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder ggf. eine soweit minimalistische Kopie Deines leeren Projektes posten, welches nur ein einziges nicht-funktionierendes ContextMenu enthält. Ohne Datenbankanbindung o.ä.
    Was würde denn passieren, wenn Du einen Button auf Dein Form haust und bei Klick jene TSIs deaktivierst? Sind sie dann immer noch aktiviert?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für eure Antworten.

    Eure Ansätze bzw. Lösungen sind mir vollkommen klar und vertraut.
    Das Problem liegt aber wohl an einer anderen Stelle, die ich nicht finde.
    Ich habe das ContextMenu nochmal neu erstellt und es Schritt für Schritt probiert, sowohl mit den Werten aus der Datenbank,
    als auch direkt mit "True" oder "False". Doch es gibt leider keinen Erfolg.
    Ich kann mal einen kleinen Code-Ausschnitt aus meinem Programm posten, jedoch sollte es daran nichts zu bemängeln geben,
    wenn doch bin ich offenen für Verbesserungsvorschläge! :)

    VB.NET-Quellcode

    1. Private Structure MenuHeader
    2. Dim Daten As Boolean
    3. Dim Artikel As Boolean
    4. Dim ArtikelEdit As Boolean
    5. ...
    6. ...
    7. End Structure
    8. Private Structure MenuData
    9. Dim Header As MenuHeader
    10. ...
    11. ...
    12. End Structure
    13. Dim Menu As MenuData
    14. ...
    15. Private Sub TestAccess()
    16. ...
    17. ...
    18. ...
    19. ' hier die sichtbaren Menüpunkte festlegen
    20. mnuDaten.Visible = Menu.Header.Daten
    21. mnuArtikel.Visible = Menu.Header.Artikel
    22. mnuArtikelEdit.Visible = Menu.Header.ArtikelEdit
    23. ...
    24. ...
    25. End Sub


    Wie gesagt, die Daten werden richtig eingelesen und sind auch so in den Variablen vorhanden.
    Die Frage allein ist nur, warum übernimmt das TSI nicht die Eigenschaft. ?(

    @VaporiZed
    Zu deinem Versuch mit dem Button. Die Eigenschaft von Visible wird nicht geändert, jedoch wird das Item dauerhaft angezeigt, obwohl es auf "False" steht.
    Wenn ich es aktiviere oder deaktiviere, dann wird der Wert übernommen.
    .wife {right: 100%; margin: 0;}
    @Bianco Von wo aus wird die Prozedur TestAccess() aufgerufen?
    Dein Codeausschnitt ist ungenügend.
    Mach ein Testprojekt (ohne Datenbank), das Deinen Effekt reproduziert.
    Wahrscheinlich wirdt Du da bereits Deinen Fehler finden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!