Alpha
Alpha

Reputation: 127

iterate through menustrip dropdownitem

How to iterate through all ToolStripMenuItem in a MenuStrip MenuStrip

con.connection3.Open();
        string query = "SELECT * FROM tblrole WHERE role = ?role";
        using (MySqlCommand cmd3 = new MySqlCommand(query,con.connection3))
        {
            cmd3.Parameters.AddWithValue("?role", roled);
            using (MySqlDataReader mdr = cmd3.ExecuteReader())
            {
                while (mdr.Read())
                {

                    for (int o = 0, i = 2; o < fileMaintenanceToolStripMenuItem.DropDownItems.Count; o++, i++)
                    {

                        fileMaintenanceToolStripMenuItem.DropDownItems[o].Visible = mdr.GetBoolean(i);

                    }
                    for (int o = 0, i = 19; o < transactionToolStripMenuItem.DropDownItems.Count; o++, i++)
                    {

                        transactionToolStripMenuItem.DropDownItems[o].Visible = mdr.GetBoolean(i);

                    }
                    for (int o = 0, i = 45; o < reportsToolStripMenuItem.DropDownItems.Count; o++, i++)
                    {

                        reportsToolStripMenuItem.DropDownItems[o].Visible = mdr.GetBoolean(i);

                    }
                    for (int o = 0, i = 55; o < utilitiesToolStripMenuItem.DropDownItems.Count; o++, i++)
                    {

                        utilitiesToolStripMenuItem.DropDownItems[o].Visible = mdr.GetBoolean(i);

                    }
                    if (!fileMaintenanceToolStripMenuItem.HasDropDownItems)fileMaintenanceToolStripMenuItem.Visible = false;
                    else fileMaintenanceToolStripMenuItem.Visible = true;
                    if (!transactionToolStripMenuItem.HasDropDownItems)transactionToolStripMenuItem.Visible = false;
                    else transactionToolStripMenuItem.Visible = true;
                    if (!reportsToolStripMenuItem.HasDropDownItems)reportsToolStripMenuItem.Visible = false;
                    else reportsToolStripMenuItem.Visible = true;
                    if (!utilitiesToolStripMenuItem.HasDropDownItems) utilitiesToolStripMenuItem.Visible = false;
                    else utilitiesToolStripMenuItem.Visible = true;
                }
            }
        }
        con.connection3.Close();

Works fine if the ToolStripMenuItem has no subitems but I need to iterate through them also

Upvotes: 1

Views: 372

Answers (1)

Reza Aghaei
Reza Aghaei

Reputation: 125227

You can use a recursive method as a good option for traversing a tree structure. Here is an extension method that you can use for listing ToolStripMenuItem descendants of a given ToolStripMenuItem:

using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

public static class ToolStripMenuItemExtensions
{
    public static List<ToolStripMenuItem> Descendants(this ToolStripMenuItem item)
    {
        var items = item.DropDownItems.OfType<ToolStripMenuItem>().ToList();
        return items.SelectMany(x => Descendants(x)).Concat(items).ToList();
    }
}

It will add Descendants to ToolStripMenuItem elements, so you can use it this way:

var allMenuItems = fileMaintenanceToolStripMenuItem.Descendants();

Upvotes: 2

Related Questions