После InitializeComponent(); скрываю пункты MenuStrip. Делаю это следующим образом:
string[] elementNames = new string[] {"name1", "name2", "name3"}
foreach (var name in elementNames)
{
var menu_item = msMainMenu.Items.Find(name, true);
menu_item[0].Visible = false;
}
Далее, когда я хочу показать какой либо пункт меню, поиск не находит этот элемент т.е.:
var menu_item = msMainMenu.Items.Find("name1", true);
(menu_item.Count() == 0) = true;
Конечно, как вариант, элементы, на которые изначально воздействовал цикл, можно убрать в массив, затем обращаться уже к нему. Но есть ли ещё какие-нибудь варианты получить экземпляр компонента имея только его имя ToolStripMenuItem.Name и при ToolStripMenuItem.Visible = false?
Приведите просто к нужному типу.
Например код скрытия можно написать так:
string[] elementNames = { "name1", "name2", "name3" };
foreach (ToolStripItem item in msMainMenu.Items)
{
item.Visible = !elementNames.Contains(item.Name);
}
А обратиться к определенному объекту так:
var item = msMainMenu.Items.Cast<ToolStripItem>().FirstOrDefault(x => x.Text == "name1");
if (item != null) item.Visible = true;
Везде как видите стоит ToolStripItem - это тот объект, который содержится в MenuStrip, значит смело указываем нужный тип и работаем с объектом на прямую, без Find().
Если же вы хотите работать с Find, то смотрите что именно этот метод вам возвращает.
Строка var menu_item = msMainMenu.Items.Find("name1", true); вернет вам ToolStripItem[], то есть массив объектов и если вы уверены, что там будет один ваш объект с нужным именем, то обращайтесь через индекс (menu_item[0].Visible = true;) или берите с помощью LINQ первый объект (menu_item.FirstOrDefault().Visible = true;). Не забудьте только обработать вариант с NULL!
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости