我必须在Form上开发一个简单的菜单,例如:
每个条目都存储在数据库中,可见或不可见,具体取决于连接的用户权限
例如,用户“J.Doe”将看不到选项C和D
我的问题是:如何做,动态避免菜单显示2个分隔符,因为很明显,在选项B和E之间只需要一个?
答案 0 :(得分:-1)
如果满足以下三个条件,只需添加分隔符:
这不应该太难。尝试按照此规范编写代码,如果遇到问题,请再次询问有关更具体的编码问题。
更新:看到这里提出的解决方案,这些解决方案都是根据您的具体问题量身定制的,我将继续向您展示如何以一种适用的方式解决一般问题任何菜单配置:
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;
}