2017-01-23 4 views
-4

Ich habe ein einfaches Menü auf einer Form zu entwickeln, wie:Wie man ein dynamisches Menü mit Trennzeichen verwaltet?

  • Datei
    • A Option
    • Option B
    • -------- (Separator 1)
    • Option C
    • Option D
    • -------- (Separator 2)
    • Option E

Jeder Eintrag in einem DB gespeichert und sichtbar ist oder nicht, je nach angeschlossenen Benutzerrechten

Zum Beispiel User "J.Doe" sieht die Optionen nicht C und D

Meine Frage ist: wie zu tun, um dynamisch zu vermeiden, dass das Menü die 2 Trennzeichen zeigt, da offensichtlich nur eins zwischen Option B und E erforderlich ist?

+2

welche Mühe haben Sie das Problem zu versuchen, getan zu lösen? –

+0

Ich habe versucht, in einem Bool zu speichern, wenn ich ein Trennzeichen einfügen. Wenn dann das nächste Menüelement auch ein Trennzeichen ist, so füge ich es nicht ein. Aber es ist verwirrt, und ich frage mich, ob es keinen richtigen oder einfachsten Weg gibt, das zu tun. – Austin

Antwort

-1

Fügen Sie einfach den Separator, wenn die folgenden drei Bedingungen erfüllt sind:

  1. Es ist mindestens ein Menüpunkt bereits vorhanden ist.
  2. Der vorherige Menüeintrag ist kein Trennzeichen.
  3. Es gibt mindestens eine weitere Menüoption, die nach der aktuellen hinzugefügt werden soll.

Das sollte nicht zu schwer sein. Versuchen Sie, Code zu schreiben, der dieser Spezifikation folgt, und wenn Sie in Schwierigkeiten geraten, kommen Sie hierher und fragen Sie noch einmal nach spezifischeren Codierproblemen.

UPDATE: die Lösungen hier vorgeschlagen sehen, die alle auf Ihre spezielle Frage abgestimmt sind, werde ich einfach weitermachen und Ihnen zeigen, wie ich das allgemeine Problem in einer Weise lösen würde, dass jede Menü für arbeitet Konfiguration:

static void DynamicallySetMenuItems(MenuItem menu, UserRole role) 
{ 
    var menuItems = GetMenuItems(role); 
    var previous = menuItems.FirstOrDefault(); 

    if (previous == null) 
     return; 

    if (!IsSeparator(previous)) 
    {  
     menu.MenuItems.Add(previous); 
    } 

    foreach (var current in menuItems.Skip(1)) 
    { 
     if (!IsSeparator(current) || 
      !IsSeparator(previous)) 
     { 
      menu.MenuItems.Add(previous); 
     } 

     previous = current; 
    }   

    if (IsSeparator(previous)) 
    { 
     menu.MenuItems.Remove(previous); 
    } 
} 

static bool IsSeparator(MenuItem menu) 
    => menu.Text == "-"; 
+0

@Downvoter Nein, nein, nein, das ist nicht nett, zumindest erklären, warum der Downvote;) – InBetween

+0

danke für Ihre Antwort – Austin

-2

Sie bauen nur das Menü im laufenden Betrieb, wie zum Beispiel:

  var myMenu = new ContextMenuStrip(); // works also with tool strip menus, main menu, etc... 
      int m = 0; 
      if(/* has option A */) 
      { 
      myMenu.Items.Add("Option A"); 
      myMenu.Items[m++].Click += OptionA_Click; 
      } 
      if(/* has option B */) 
      { 
      myMenu.Items.Add("Option B"); 
      myMenu.Items[m++].Click += OptionB_Click; 
      } 
      if(/* has option C or D */) 
      { 
      myMenu.Items.Add(new ToolStripSeparator()); 
      m++; 
      } 
      if(/* has option C */) 
      { 
      myMenu.Items.Add("Option C"); 
      myMenu.Items[m++].Click += OptionC_Click; 
      } 
      if(/* has option D */) 
      { 
      myMenu.Items.Add("Option D"); 
      myMenu.Items[m++].Click += OptionD_Click; 
      } 
      if(/* has option E */) 
      { 
      myMenu.Items.Add(new ToolStripSeparator()); 
      myMenu.Items.Add("Option E"); 
      myMenu.Items[++m].Click += OptionE_Click; 
      } 
+0

danke für Ihre Antwort – Austin

Verwandte Themen