Как программно включить \ отключить вложенные элементы подменю в ToolStripMenuItem? - PullRequest
1 голос
/ 26 февраля 2012

В моем приложении Winforms у меня есть ToolStripMenuItem с вложенными подэлементами, структура которых показана ниже.

Файл
. + ... Добавить как .... + ..... Файл
............................ Папка
............................ Корневая папка

В разделе «Добавить как» я хочу иметь возможность программно включать и отключать «Файл», «Папка» и «Корневая папка» по мере необходимости. Как я могу получить доступ к этим вложенным элементам в коде?

Я пробовал ToolStripMenuItem.DropDownItems [0] .Enabled = true \ false; но это влияет на «Добавить как» и все под ним в меню иерархии.

Если я использую индекс выше нуля в приведенном выше коде, я получаю ошибку «индекс вне диапазона». Как мне добиться этой функциональности?

Ответы [ 2 ]

7 голосов
/ 26 февраля 2012

Просто ссылайтесь на подпункты своими именами, например:

FileToolStripMenuItem.Enabled = false;
FolderToolStripMenuItem.Enabled = false;
RootFolderToolStripMenuItem.Enabled = false;

Если я что-то упустил, это кажется самым простым ответом.

3 голосов
/ 27 февраля 2012

Как намекал Ганс в своем комментарии, вы ссылаетесь на неправильную коллекцию DropDownItems.

Чтобы сделать это с помощью индексов, вы получите уродливую скорость.

Проще просто сослаться на родительское меню ицикл по «своей» коллекции меню:

private void toggleMenu_Click(object sender, EventArgs e) {
  foreach (ToolStripMenuItem toolItem in addAsToolStripMenuItem.DropDownItems) {
    toolItem.Enabled = !toolItem.Enabled;
  }
}

Вот уродливый метод, который было бы трудно поддерживать, если бы вы позже решили изменить структуру меню:

  foreach (ToolStripMenuItem toolItem in ((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).DropDownItems) {
    toolItem.Enabled = !toolItem.Enabled;
  }
...