2017-01-23 78 views
-4

我不得不開發窗體上的一個簡單的菜單,如:如何使用分隔符管理動態菜單?

  • 文件
    • 選項A
    • 選項B
    • --------(分離器1)
    • 選項C
    • 選項d
    • --------(隔膜2)
    • 選項Ë

每個條目都存儲在DB和是可見或不可見,這取決於連接的用戶權利

例如,用戶「J.Doe」將不會看到選件C和D

我的問題是:如何做,動態避免菜單顯示2個分隔符,因爲顯然,只有一個是需要之間的選項B和E?

+2

什麼工作你做了嘗試解決這個問題? –

+0

我試圖存儲在一個布爾,當我插入一個分隔符。 然後,如果下一個菜單項也是分隔符,所以我不插入它。 但它很混亂,我問我是否沒有正確或最簡單的方法來做到這一點。 – Austin

回答

-1

只需添加分隔符,如果以下三個條件都滿足:

  1. 至少有一個菜單項已經存在。
  2. 上一個菜單項不是分隔符。
  3. 至少還有一個菜單項要添加到當前菜單項之後。

這應該不會太難。試着按照這個規範編寫代碼,如果遇到麻煩來到這裏,再次詢問更具體的編碼問題。

UPDATE:看到這裏提出的解決方案,都是針對您的具體問題,我就先走一步,告訴你我是怎麼想解決的普遍問題,用於任何菜單的工作方式配置:

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不,不,不,不,那不是很好,至少解釋爲什麼downvote;) – InBetween

+0

感謝您的回答 – Austin

-2

你剛纔建立菜單上的蒼蠅,因爲這樣:

  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

感謝您的回答 – Austin