Как пройти по всем элементам MenuStrip?

dima1257
Дата: 07.05.2014 23:45:17
Добрый вечер.

Пытаюсь пройти по всем элементам меню. После 4х часов проб и ошибок нашел вот такой код:


foreach (ToolStripMenuItem mainItem in menuStrip1.Items)
            {
                MessageBox.Show(mainItem.Name);
                foreach (ToolStripItem menuItem in mainItem.DropDownItems)
                {
                    MessageBox.Show(menuItem.Name);
                }
            }


Но он проходит по только по самим названиям меню и по подменю, а глубже соответственно не заходит.

Если написать this. то после точки можно обратиться например к ФайлToolStripMenuItem, а вот рекурсивным циклом по всем контролам попасть на эти меню не получается.

Попробовал
ArrayList st2 = ArrayList.Adapter(menuStrip1.Items) ;

в st2 попадает коллекция только основного меню т.е. например Файл и Вид.

Покажите пожалуйста как получить все элементы со всеми дочерними.
Где-то в степи
Дата: 07.05.2014 23:57:06
dima1257,
наверное надо применить рекурсию
dima1257
Дата: 08.05.2014 00:03:38
рекурсию пытался написать, но не получилось. Вообще мало задач на рекурсию попадалось.

Покажите пожалуйста если есть.
Shocker.Pro
Дата: 08.05.2014 00:07:32
+
Чтобы понять рекурсию, надо понять рекурсию. (с)

(сорри, не удержался)
Где-то в степи
Дата: 08.05.2014 01:51:47
dima1257
рекурсию пытался написать, но не получилось. Вообще мало задач на рекурсию попадалось.

Покажите пожалуйста если есть.

 static void Rec(IEnumerable collection, Action<ToolStripMenuItem> ccAction)
        {
            foreach (var mainItem in collection)
            {
                ccAction((ToolStripMenuItem)mainItem);
                Rec(((ToolStripMenuItem)mainItem).DropDownItems, ccAction);
            }
        }

а так вызывать..
            Rec(menuStrip1.Items, down => MessageBox.Show(down.Name));
dima1257
Дата: 08.05.2014 09:07:39
Большое спасибо. Действительно всё обходит.

Достаточно интересное решение.

Скажите пожалуйста что в вызове функции обозначает down => ?
Shocker.Pro
Дата: 08.05.2014 09:52:24
dima1257
Скажите пожалуйста что в вызове функции обозначает down => ?
http://msdn.microsoft.com/ru-ru/library/bb397687.aspx
dma_caviar
Дата: 08.05.2014 10:10:43
Грузанули человека своими лямбда выражениями, теперь он будет думать что это связано с рекурсией)
Shocker.Pro
Дата: 08.05.2014 10:24:55
ИМХО, если человек в принципе пишет на #, он должен понимать, что такое делегат и лябмда, это одна из основ все-таки.
Где-то в степи
Дата: 08.05.2014 10:39:54
Вообще то извиняюся, решил сделать в стиле Нахлобуча ))
за такое можно и получить ( в коллективе без изысков)
надо писать проще..
Вот недавний пример : отправил решение
с вот таким
#if(DEBUG)
            Console.WriteLine(" что то там о итерации..");
#endif

он ( индус) с истерикой мне объяснял что если в релизе программы итераций очень много, пользователю
эти данные не нужны.., вообще мало кто знает что такое #if(.( я не шучу)