簡體   English   中英

如何在菜單條級別循環所有子菜單項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM