如何使用分隔符管理动态菜单?

时间:2017-01-23 11:29:57

标签: c# menuitem separator

我必须在Form上开发一个简单的菜单,例如:

  • 文件
    • 选项A
    • 选项B
    • --------(分隔符1)
    • 选项C
    • 选项D
    • --------(分隔符2)
    • 选项E

每个条目都存储在数据库中,可见或不可见,具体取决于连接的用户权限

例如,用户“J.Doe”将看不到选项C和D

我的问题是:如何做,动态避免菜单显示2个分隔符,因为很明显,在选项B和E之间只需要一个?

2 个答案:

答案 0 :(得分:-1)

如果满足以下三个条件,只需添加分隔符:

  1. 至少有一个菜单项已经存在。
  2. 上一个菜单项不是分隔符。
  3. 在当前的菜单项之后至少还要添加一个菜单项。
  4. 这不应该太难。尝试按照此规范编写代码,如果遇到问题,请再次询问有关更具体的编码问题。

    更新:看到这里提出的解决方案,这些解决方案都是根据您的具体问题量身定制的,我将继续向您展示如何以一种适用的方式解决一般问题任何菜单配置:

    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 == "-";
    

答案 1 :(得分:-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;
            }
相关问题