powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как пройти по всем элементам MenuStrip?
14 сообщений из 14, страница 1 из 1
Как пройти по всем элементам MenuStrip?
    #38636082
dima1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер.

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


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
foreach (ToolStripMenuItem mainItem in menuStrip1.Items)
            {
                MessageBox.Show(mainItem.Name);
                foreach (ToolStripItem menuItem in mainItem.DropDownItems)
                {
                    MessageBox.Show(menuItem.Name);
                }
            }



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

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

Попробовал
Код: c#
1.
ArrayList st2 = ArrayList.Adapter(menuStrip1.Items) ;


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

Покажите пожалуйста как получить все элементы со всеми дочерними.
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636087
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dima1257,
наверное надо применить рекурсию
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636091
dima1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
рекурсию пытался написать, но не получилось. Вообще мало задач на рекурсию попадалось.

Покажите пожалуйста если есть.
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636093
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы понять рекурсию, надо понять рекурсию. (с)

(сорри, не удержался)
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636114
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dima1257рекурсию пытался написать, но не получилось. Вообще мало задач на рекурсию попадалось.

Покажите пожалуйста если есть.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 static void Rec(IEnumerable collection, Action<ToolStripMenuItem> ccAction)
        {
            foreach (var mainItem in collection)
            {
                ccAction((ToolStripMenuItem)mainItem);
                Rec(((ToolStripMenuItem)mainItem).DropDownItems, ccAction);
            }
        }


а так вызывать..
Код: c#
1.
            Rec(menuStrip1.Items, down => MessageBox.Show(down.Name));
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636213
dima1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо. Действительно всё обходит.

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

Скажите пожалуйста что в вызове функции обозначает down => ?
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636244
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dima1257Скажите пожалуйста что в вызове функции обозначает down => ? http://msdn.microsoft.com/ru-ru/library/bb397687.aspx
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636268
dma_caviar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грузанули человека своими лямбда выражениями, теперь он будет думать что это связано с рекурсией)
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636297
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, если человек в принципе пишет на #, он должен понимать, что такое делегат и лябмда, это одна из основ все-таки.
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636324
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще то извиняюся, решил сделать в стиле Нахлобуча ))
за такое можно и получить ( в коллективе без изысков)
надо писать проще..
Вот недавний пример : отправил решение
с вот таким
Код: c#
1.
2.
3.
#if(DEBUG)
            Console.WriteLine(" что то там о итерации..");
#endif


он ( индус) с истерикой мне объяснял что если в релизе программы итераций очень много, пользователю
эти данные не нужны.., вообще мало кто знает что такое #if(.( я не шучу)
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636360
dima1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Буду разбираться.


п.с.: я пишу вот так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#define DEBUG
#undef DEBUG

...

#if DEBUG

...

#else

...

#endif



и когда надо подебажить, то комментирую #undef DEBUG
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636391
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dima1257,
вообще то если переписать по доступней, получится так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 static void Rec(ToolStripItemCollection collection)
        {
            foreach (var mainItem in collection)
            {
                MessageBox.Show(((ToolStripMenuItem) mainItem).Name);
                Rec(((ToolStripMenuItem)mainItem).DropDownItems);
            }
        }
 Rec(menuStrip1.Items);


имхо, тяжело читаемо, и масштабируемо
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636550
dima1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я могу сериализовать menuStrip? На самом деле это было бы даже лучше.
А потом в xml запишу.

Недавно занимался сохранением treeView и у них структура очень похожа.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// сохранение дерева
            treeEtalon.Sort();  // отсортируем
            //массив временый который и будем сериализовать
            TreeNode[] tempNodes = new TreeNode[treeEtalon.Nodes.Count];
            // заполняем его
            for (int i = 0; i < treeEtalon.Nodes.Count; i++)
                tempNodes[i] = treeEtalon.Nodes[i];
            // сама сериализация
            FileStream fs = new FileStream("tree.xml", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fs, tempNodes);
            fs.Close();
            treeEtalon.Nodes.Clear(); // очищаем


Тут tempNodes указатель на вершины.
т.е. получается из меню мне необходимо получить указатели на Файл и Вид.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            //массив временый который и будем сериализовать
            ToolStripItem[] tempItems = new ToolStripItem[menuStrip1.Items.Count];
            // заполняем его
            for (int i = 0; i < menuStrip1.Items.Count; i++)
                tempItems[i] = menuStrip1.Items[i];
            // сама сериализация
            FileStream fs = new FileStream("menuStrip.xml", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fs, tempItems);
            fs.Close();


Выдает ошибку
Тип "System.Windows.Forms.ToolStripItem" в сборке "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" не помечен как сериализуемый.
...
Рейтинг: 0 / 0
Как пройти по всем элементам MenuStrip?
    #38636590
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dima1257,авторА я могу сериализовать menuStrip?
конечно, как ? спросите у гугла
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как пройти по всем элементам MenuStrip?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]