[英]how to loop all submenu items in a menu strip level
我已經嘗試了數周的時間,以了解如何在MenuStrip
SubMenu
循環播放所有項目。 我的問題是,如果我添加新的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;
}
}
}
}
沒有人能給您確切的答案。 但是,這是您與Linq一起玩的線索。
public class AccessRight
{
public string FormName { get; set; }
public int CanView { get; set; }
}
public void ApplySecurity()
{
// ---
if (dtDBRoleControl.Rows.Count > 0)
{
// first loop through your database rows.
// create a small POCO to perform actions.
List<AccessRight> accessRights = new List<AccessRight>();
foreach(var drmaster in dtDBRoleControl.Rows){
var access = new AccessRight() { FormName = drmaster["rprevformname"].ToString(), CanView = Convert.ToInt32(drmaster["rprevview"]) };
accessRights.Add(access);
}
// close your database here...
// now for each menu call a method as given below
PerformActionOnMenu(masterToolStripMenuItem, accessRights);
PerformActionOnMenu(servicesToolStripMenuItem, accessRights);
PerformActionOnMenu(reportsToolStripMenuItem, accessRights);
PerformActionOnMenu(maintenanceToolStripMenuItem, accessRights);
}
}
private void PerformActionOnMenu(ToolStripMenuItem menuItem , List<AccessRight> accessRights)
{
var result = from item in menuItem.DropDownItems
where item.Tag != null && item.Tag.ToString()
join x in accessRights on x.FormName.Equals( item.Tag)
select new { DropDownItem = item, Access = x};
if ( result != null && result.Count() > 0 )
{
menuItem.Visible = true;
foreach(var r in results ){
r.DropDownItem.Visible = true;
}
}
}
將strip更改為您所謂的MenuStrip控件。
private void startLoop()
{
for(int a = 0; a< strip.Items.Count;a++)
recursiveLoop(strip.Items[a]);
}
private void recursiveLoop(ToolStripMenuItem item)
{
//DO YOUR LOGIC HERE
item.Visible = true;
//
for(int a = 0; a< item.Items.Count;a++)
recusiveLoop(item.Items[a]);
}
沒有測試它,但它應該像這樣工作。 如果您使用分隔符,則可能需要檢查類型,因為我不記得它們是否是作為ToolStripMenuItem的單獨控件。 只需將recursiveLoop參數更改為Control並檢查typeof(item)的內部並將其與您使用的所有內容進行比較,並根據其內容和其他參數進行操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.