Включение элементов полосы меню во время выполнения

Моя полоса меню выглядит так, как показано ниже.
 введите описание изображения здесь во время загрузки, я хочу сделать true для свойств enable и visible. Ниже мой код, но он не использует параметры предварительного просмотра и печати в параметрах печати.

foreach (ToolStripMenuItem i in menuStrip.Items)
{                   
    for (int x = 0; x <= i.DropDownItems.Count-1; x++)
    {
        i.DropDownItems[x].Visible = true;
        i.DropDownItems[x].Enabled = true;
    }
    i.Available = true;
    i.Visible = true;
    i.Enabled = true;
}

person Mohan    schedule 17.12.2018    source источник
comment
Здесь это делается с помощью рекурсивного метода, stackoverflow .com / questions / 9124587 /   -  person affanBajwa    schedule 17.12.2018
comment
@Mohan Не могли бы вы предоставить более подробную информацию, так как этой информации недостаточно.   -  person Nikunj Kakadiya    schedule 17.12.2018


Ответы (1)


Я бы предложил использовать некоторые Методы расширения на:

  • Получить всех потомков (детей, детей детей, ...) для MenuStrip, ToolStrip или ContextMenuStrip или StatusStrip
  • Получить всех потомков предмета
  • Получить предмет и всех его потомков

Методы расширения потомков

Следующие методы расширения будут работать для MenuStrip, ToolStrip, ContextMenuStrip или StatusStrip:

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

public static class ToolStripExtensions
{
    public static IEnumerable<ToolStripItem> Descendants(this ToolStrip toolStrip)
    {
        return toolStrip.Items.Flatten();
    }
    public static IEnumerable<ToolStripItem> Descendants(this ToolStripDropDownItem item)
    {
        return item.DropDownItems.Flatten();
    }
    public static IEnumerable<ToolStripItem> DescendantsAndSelf (this ToolStripDropDownItem item)
    {
        return (new[] { item }).Concat(item.DropDownItems.Flatten());
    }
    private static IEnumerable<ToolStripItem> Flatten(this ToolStripItemCollection items)
    {
        foreach (ToolStripItem i in items)
        {
            yield return i;
            if (i is ToolStripDropDownItem)
                foreach (ToolStripItem s in ((ToolStripDropDownItem)i).DropDownItems.Flatten())
                    yield return s;
        }
    }
}

Пример

  • Отключить всех потомков определенного элемента:

    fileToolStripMenuItem.Descendants().ToList()
        .ForEach(x => {
            x.Enabled = false;
        });
    
  • Отключить всех потомков полосы меню:

    menuStrip1.Descendants().ToList()
        .ForEach(x => {
            x.Enabled = false;
        });
    
person Reza Aghaei    schedule 17.12.2018
comment
Мохан, если у вас возникли какие-либо затруднения по поводу методов расширения, взгляните на Методы расширения C # и дайте мне знать, если у вас возникнут трудности с применением решения. Это наиболее универсальное решение, которое вы можете использовать для таких требований. - person Reza Aghaei; 29.12.2018