Announcement

Collapse
No announcement yet.

Sichtbarkeit von Menüeinträgen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sichtbarkeit von Menüeinträgen

    Hi Leute,

    ich bin da gerade über etwas seltsames gestolpert:

    Mein Chef wollte, dass die Menüeinträge, an die ein User gerade eh nicht rankommt nicht nur deaktiviert (also ausgegraut) sondern komplett unsichtbar sind, dadurch war eine kleine Umstrukturierung der Funktionen notwendig, die die Fenster für die Anzeige vorbereiten.

    Ich definiere die Sichtbarkeit bestimmter Menüeinträge nun abhängig davon, in welchem Zustand sich das aktuelle Programm befindet (welche Registerkarten angezeigt werden, welche Berechtigung der User hat, mit welchen Parametern bestimmte Dialoge geöffnet wurden usw.) dadurch kann es kommen, dass ab und zu mehrere Menüseparatoren hintereinanden stehen oder das Menü von vorneherein mit einem Separator anfängt (weil die Einträge darüber oder dazwischen gerade ALLE ausgeblendet sind). Ich dachte mir nun, ich überprüfe einfach die Sichtbarkeit der darüberliegenden Menüeinträge und blende dann den Separator auch aus, also so nach dem Motto

    Code:
    Me.mnuBearbeitenKonstr.Visible = ...
    Me.mnuBearbeitenVerkauf.Visible = ...
    Me.mnuBearbeitenLager.Visible = ...
    Me.mnuBearbeitenSep1.Visible = Me.mnuBearbeitenKonstr.Visible Or Me.mnubearbeitenVerkauf.Visible _
         Or Me.mnuBearbeitenLager.Visible
    Das Problem ist nun, dass der Separator gar nicht erst angezeigt wird, weil aus irgendwelchen Gründen die Abfrage nach der Visible-Eigenschaft des MenuItems grundsätzlich mit False zurückkommt. Hat das irgendeinen Grund, oder spinnt da einfach nur meine Entwicklungsumgebung (VS 2005)?

    Ich habe auf der anderen Seite aber definitiv keine Lust, alle möglichen Bedingungen aus den oberen drei Zeilen in der vierten zeile zu verodern, schon allein weil das für Änderungen hinterher wieder eine große Fehlerquelle ist, wenn z.B. plötzlich entschieden wird, dass bestimmte MA aus dem Verkauf die Lagersicht sehen dürfen, aber nur der Lagerist ändern darf, ist dieses Menü plötzlich wieder für den Verkauf sichtbar, aber wieder nicht für alle, und schon sitze ich (oder mein Nachfolger) da und muss diese Anpassung an 2 Stellen im Code durchführen.

    Eine andere Möglichkeit wäre eine Variable mitzuführen, die positiv geschaltet wird, wenn eines sichtbar ist, also nach der Art
    Code:
    Dim anzeigen as Boolean = False
    If ... Then
       anzeigen = True
       Me.mnuBearbeitenKonstr.Visible=True
    else
       Me.mnuBearbeitenKonstr.Visible=False
    End If
    
    If ... Then
       anzeigen = True
       Me.mnubearbeitenVerkauf.Visible=True
    else
       Me.mnuBearbeitenVerkauf.Visible=False
    End If
    
    If ... Then
       anzeigen = True
       Me.mnuBearbeitenLager.Visible=True
    Else
       Me.mnuBearbeitenLager.Visible=False
    End If
    
    Me.mnuBearbeitenSep1.Visible=anzeigen
    anzeigen=False
    aber dann muss man wieder darauf achten, dass die Variable anzeigen korrekt mitgeführt und zurückgesetzt wird, was dann wieder einen extra Aufwand bedeutet, wenn bestimmte Menüpunkte plätzlich in andere Gruppen wechseln.

    Die Frage ist nun also, warum erhalte ich bei der Abfrage der Visible-Eigenschaft eines ToolStripMenuItems ein False, obwohl ich sie gerade eben auf True gesetzt habe, und wie kann ich dieses Problem umgehen?

    Schönen Gruß
    Martin Dietz

  • #2
    Hallo Martin,

    bei mir liefert die .Visible Eigenschaft immer FALSE zurück, egal welchen Zustand der Menüeintrag hat. Kann es sein das VS 2005 da ein kleines bis mittelprächtiges Problem hat?

    Schönen Gruß
    Womble

    Comment


    • #3
      Originally posted by M.Dietz View Post
      Hi Leute,

      Die Frage ist nun also, warum erhalte ich bei der Abfrage der Visible-Eigenschaft eines ToolStripMenuItems ein False, obwohl ich sie gerade eben auf True gesetzt habe, und wie kann ich dieses Problem umgehen?

      Schönen Gruß
      Martin Dietz
      zum Problem selbst:

      Also ich hab das auch gerade mal nachvollzogen.

      Die ToolStripMenuItems werden als Visible= True gesetzt, wenn sie auch wirklich sichtbar sind. Solche wären z.B. Datei, Bearbeiten, Hilfe u.s.w. also die, welche das Hauptmenu bilden. Alle Untermenus ändern den Zustand von Visible für den Zeitraum, wenn wirklich sichtbar sind.
      Beispiel:
      Hauptmenueintrag ist Datei
      Untermenueintrag ist Öffnen

      Anwendungstart:
      - Datei -> Visible = True
      - Öffnen -> Visible = False

      Klick auf Datei:

      - Datei -> Visible = True
      - Öffnen -> Visible = True

      Also, es werden die Untermenueinträge nur als True gewertet, wenn sie in der Form sichtbar sind.

      Im Fall der Zuweisung ist es etwas anders.
      Wenn die Zuweisung eines Menueintrages Visible = False ist, dann ist die Abfrage auch Visible = Flase. Der Eintrag wird und bleibt ausgeblendet.
      Wenn die Zuweisung eines Menueintrages Visible = True(Standard) ist, dann ist die Abfrage auf Visible nur True, wenn der Menueintrag angezeigt wird.

      Nachvollziehen kannst du das z.b., wenn du im Event Hauptmenueintrag.Click das Visible der Untermenueinträge abfragst. Alle sichtbaren Untermenus geben dann True zurück.

      Originally posted by M.Dietz View Post
      und wie kann ich dieses Problem umgehen?
      Du könntest im gleichen Zug, wie du Visible setzt Enabled auf True oder False setzen. Enabled ist eigentlich immer abfragbar. Oder du nimmst nur Enabled und hast dann eben ausgegraute Menueinträge.

      Sauberer wäre aber die GUI aus der ganzen Sache raus zu lassen, also den Code besser nach den Schichten zu trennen.

      3-Schicht-Modell:
      Präsentationsschicht - Anwendungsschicht - Datenschicht

      Du erstellst alle Bedinungen(z.b. Benutzer darf dies und das sehen) in der Anwendungsschicht und machst nur ein SET Visibility auf die Präsentationsschicht.

      mfg laptel

      Comment


      • #4
        Eine komplette Verwaltung nur auf Basis des Users ist leider nicht möglich, da die Verfügbarkeit von Menueinträgen unter anderem auch davon abhängen kann, welches Element des ListViews gerade gewählt ist, also wenn z.B. ein Eintrag ausgewählt ist, der in der Datenbank als "storniert" markiert ist, dürfen bestimmte Einträge aus Bearbeiten gar nicht ausgewählt werden, außer von Administratoren, bestimmte Menüeinträge wie Übermittlung zu anderen Datenbanken dürfen nur benutzt werden, wenn der ausgewählte Vorgang bestimmte Kriterien erfüllt usw.

        Wenn dann nun sowohl die Anwendungsschicht (vom Benutzer her) als auch die Präsentationsschicht (vom ListView.SelectedItemChanged) in die Sichtbarkeit von Menüeinträgen reinpfuschen, bzw. die Präsentationsschicht dann der Anwendungsschicht den Auftrag gibt, eine Sichtbarkeitsumschaltung in der Präsentationsschicht zu beantragen, kann ich die Trennung der Schichten gleich vergessen. Das wird dann zu unübersichtlich.

        Ich denke mal, ich werde es so machen, dass wenn ich die Sichtbarkeit eines Menueintrags setze, seine Enabled-Eigenschaft mit umsetze, wie Du vorgeschlagen hast. Ist nicht der sauberste Programmierstil von allen, geht aber schneller und ist mit entsprechenden Kommentaren für andere, die diesen Code nach mir betreuen, besser verständlich.

        Danke soweit
        Martin Dietz

        Comment

        Working...
        X