我在我一直试图星期如何循环的所有项目SubMenu
上MenuStrip
。我的问题是,如果添加一个新商品SubMenu
,我必须输入代码以再次使其循环以控制我的物品。基本上,我SubMenu
只是为了控制我的物品而循环播放。我想要的是循环该MenuStrip
级别中的所有项目而不是子菜单级别
这是我的阶层。
这是我的代码
public void startUpRoleControl()
{
loadRoleControl();
disableAllToolStripItems();
bool varmasterDropItem = false;
bool varservicesDropItem = false;
bool varreportsDropItem = false;
bool varmaintenanceDropItem = false;
bool varuseroptionsDropItem = false;
if (dtDBRoleControl.Rows.Count > 0)
{
foreach(DataRow drmaster in dtDBRoleControl.Rows)
{
foreach (ToolStripItem masterDropItem in masterToolStripMenuItem.DropDownItems) // use to disable sub items of mastermenu
{
if (masterDropItem.Tag != null)
{
if (masterDropItem.Tag.ToString() == drmaster["rprevformname"].ToString() && Convert.ToInt32(drmaster["rprevview"]) == 1)
{
masterDropItem.Visible = true;
varmasterDropItem = true;
break;
}
}
}
}
foreach (DataRow drservices in dtDBRoleControl.Rows)
{
foreach (ToolStripItem servicesDropItem in servicesToolStripMenuItem.DropDownItems) // use to disable sub items of mastermenu
{
if (servicesDropItem.Tag != null)
{
if (servicesDropItem.Tag.ToString() == drservices["rprevformname"].ToString() && Convert.ToInt32(drservices["rprevview"]) == 1)
{
servicesDropItem.Visible = true;
varservicesDropItem = true;
break;
}
}
}
}
foreach (DataRow drreports in dtDBRoleControl.Rows)
{
foreach (ToolStripItem reportsDropItem in reportsToolStripMenuItem.DropDownItems) // use to disable sub items of mastermenu
{
if (reportsDropItem.Tag != null)
{
if (reportsDropItem.Tag.ToString() == drreports["rprevformname"].ToString() && Convert.ToInt32(drreports["rprevview"]) == 1)
{
reportsDropItem.Visible = true;
varreportsDropItem=true;
break;
}
}
}
}
foreach (DataRow druseroptions in dtDBRoleControl.Rows)
{
foreach (ToolStripItem useroptionsDropItem in reportsToolStripMenuItem.DropDownItems) // use to disable sub items of mastermenu
{
if (useroptionsDropItem.Tag != null)
{
if (useroptionsDropItem.Tag.ToString() == druseroptions["rprevformname"].ToString() && Convert.ToInt32(druseroptions["rprevview"]) == 1)
{
useroptionsDropItem.Visible = true;
varuseroptionsDropItem = true;
break;
}
}
}
}
foreach (DataRow drmaintenance in dtDBRoleControl.Rows)
{
foreach (ToolStripItem maintenanceDropItem in maintenanceToolStripMenuItem.DropDownItems) // use to disable sub items of mastermenu
{
if (maintenanceDropItem.Tag != null)
{
if (maintenanceDropItem.Tag.ToString() == drmaintenance["rprevformname"].ToString() && Convert.ToInt32(drmaintenance["rprevview"]) == 1)
{
maintenanceDropItem.Visible = true;
varmaintenanceDropItem = true;
break;
}
}
}
}
if (varmasterDropItem == true) // shows master item if there is a item in master that are visible
{
masterToolStripMenuItem.Visible = true;
}
if (varservicesDropItem == true)// shows services item if there is a item in services that are visible
{
servicesToolStripMenuItem.Visible = true;
}
if (varreportsDropItem == true)// shows services item if there is a item in services that are visible
{
reportsToolStripMenuItem.Visible = true;
}
if (varmaintenanceDropItem == true)// shows services item if there is a item in services that are visible
{
maintenanceToolStripMenuItem.Visible = true;
}
if (varuseroptionsDropItem == true)// shows services item if there is a item in services that are visible
{
userOptionsToolStripMenuItem.Visible = true;
}
}
如您所见,子菜单越多,我必须控制的代码越多。还有什么其他方法可以循环显示主菜单中的所有项目。我正在使用数据库来控制所有菜单项的可见性。有没有办法使用最小循环语句而不是每个子菜单循环
好的,这是我可以根据您的图像/示例尝试的方法(这将遍历所有菜单和子菜单项,然后设置其可见性-在Visual Studio 2010中测试):
public void startUpRoleControl()
{
loadRoleControl();
disableAllToolStripItems();
if (dtDBRoleControl.Rows.Count > 0)
{
for (int i = 0; i < menuStrip1.Items.Count; i++ ) //menuStrip1 is the main menu strip which holds the menu items.
{
foreach(DataRow drmaster in dtDBRoleControl.Rows)
{
ProcessDropDown(menuStrip1.Items[i], drmaster["rprevformname"].ToString(), Convert.ToInt32(drmaster["rprevview"]) );
}
}
}
}
private void ProcessDropDown(ToolStripItem item, string rprevformname, int rprevview)
{
ToolStripMenuItem menuItem = (ToolStripMenuItem)item; //Type casting from ToolStripItem to ToolStripMenuItem
if (!menuItem.HasDropDownItems)
return;
else
{
foreach (ToolStripMenuItem val in menuItem.DropDownItems)
{
if (val.HasDropDownItems)
ProcessDropDown(val, rprevformname, rprevview);
if (val.Tag != null && val.Tag.ToString() == rprevformname, && rprevview == 1)
{
val.Visible = false;
menuItem.Visible = false;
}
}
}
}
考虑到上述情况,我建议您在确定菜单项对某个值的可见性方面花费过多的开销
更新:
只是为了确保不会发生类型转换错误,您可以检查项目是否可转换,例如:
private void ProcessDropDown(ToolStripItem item)
{
ToolStripMenuItem menuItem = item as ToolStripMenuItem; //Type casting from ToolStripItem to ToolStripMenuItem
if (menuItem == null)
return;
if (!menuItem.HasDropDownItems)
return;
else
{
foreach (var val in menuItem.DropDownItems)
{
ToolStripMenuItem menuTool = val as ToolStripMenuItem;
if (menuTool == null)
continue;
if (menuTool.HasDropDownItems)
ProcessDropDown(menuTool);
if (menuTool.Tag != null && menuTool.Tag.ToString() == "nagaraj")
{
menuTool.Text = false;
menuItem.Visible = false;
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句