Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
1

Как обратиться к подменю menuStrip, созданному программно на основе файлов?

21.08.2019, 04:50. Показов 4564. Ответов 7

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Создаю подменю пункта menuStrip на основе файлов в конкретной папке. Пункты создаются, называются по имени файла. Но как запустить какой-нибудь метод по нажатию любого из этих подпунктов, что-то никак не соображу.
Вот мой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
       private void pToolStripMenuItem_DropDownClosed(object sender, EventArgs e)
        {
            pToolStripMenuItem.DropDownItems.Clear();
        }
 
        private void pToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            DirectoryInfo dirP = new DirectoryInfo("D:\\MyProg\\director");
            FileInfo[] files = dirP.GetFiles("*.txt");
 
            for (int i = 0; i < files.Length; i++)
            {
                FileInfo fi = files[i];
                pToolStripMenuItem.DropDownItems.Add(fi.Name);
            }
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2019, 04:50
Ответы с готовыми решениями:

MenuStrip: обратиться к динамически созданным подменю
Доброго времени суток всем. Есть MenuStrip1 на форме. У него есть пункт Файл, а в нем пункт...

Работа с MainMenu. Как обратиться к программно созданному элементу меню?
Привет всем. задача следующая. на стартовой форме есть MainMenu с уже кое-каким меню(скажем...

Программно добавить подменю в menuStrip
пытаюсь программно добавить подменю. ToolStripMenuItem it = new ToolStripMenuItem(); ...

Обратиться к программно созданному Edit-у
Доброго времени суток. Подскажите, как обратиться к программно созданному едиту и веббраузеру на...

7
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
21.08.2019, 09:36 2
Цитата Сообщение от Keramer82 Посмотреть сообщение
Но как запустить какой-нибудь метод по нажатию любого из этих подпунктов
добавить обработчик нажатия на pToolStripMenuItem, должно получится что-то вроде:
C#
1
 pToolStripMenuItem.Click+=Tools_Click;
а далее вам студия предложит создать не хватающий метод. Создате, и выкладываете его содержимое здесь, далее будем по шагам искать нужное действие!
0
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
21.08.2019, 10:20  [ТС] 3
Добавил, но событие-то происходит при нажатии верхнего уровня меню, а вот как добавить событие на нажатие любого пункта из подменю, созданного программно, до меня не доходит.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private void pToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            DirectoryInfo dirP = new DirectoryInfo("D:\\MyProg\\director");
            FileInfo[] files = dirP.GetFiles("*.icc");
 
            for (int i = 0; i < files.Length; i++)
            {
                FileInfo fi = files[i];
                pToolStripMenuItem.DropDownItems.Add(fi.Name);
            }
            pToolStripMenuItem.Click += Tools_Click;
        }
 
        private void Tools_Click(object sender, EventArgs e)
        {
            using (MagickImage image = new MagickImage(pic))
            {
                //Определение текущего цветового профиля
                ColorProfile tempColorProfil;
                tempColorProfil = image.GetColorProfile();
                if (tempColorProfil != null)
                {
                    image.AddProfile(tempColorProfil);
                }
                //Попадаются файлы без профиля
                if (tempColorProfil == null)
                {
                    image.AddProfile(ColorProfile.SRGB);
                }
                // Добавление профиля в который нужно конвертировать
                image.AddProfile(new ColorProfile("D:\\MyProg\\cvetoprof\\JapanColor2002Newspaper.icc"));
                // запись временного файла
                image.Write("D:\\MyProg\\Temp\\tempFile.tiff");
 
                //Чтение из временного файля для отображения в picturebox
                pictureBox1.Image = (Bitmap)Image.FromFile("D:\\MyProg\\Temp\\tempFile.tiff");
                pic = (Bitmap)pictureBox1.Image;
                pictureBox1.Refresh();
                this.Text += " " + " *JapanColor2002Newspaper";
            }
        }
0
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
21.08.2019, 10:48 4
Keramer82, немного добрых советов:
1. Делите код на как можно меньшие куски.
2. читайте внимательно документацию.
3. Невпихивайте все действие в один метод, это не S.O.L.I.D.-но (читай первый пункт).
4. Поспешайте не торопясь!
Значит, вам удалось создать метод обработки, давайте го пока очистим от не нужного хлама:
Цитата Сообщение от Keramer82 Посмотреть сообщение
using (MagickImage image = new MagickImage(pic))
{
//Определение текущего цветового профиля
ColorProfile tempColorProfil;
tempColorProfil = image.GetColorProfile();
if (tempColorProfil != null)
{
image.AddProfile(tempColorProfil);
}
//Попадаются файлы без профиля
if (tempColorProfil == null)
{
image.AddProfile(ColorProfile.SRGB);
}
// Добавление профиля в который нужно конвертировать
image.AddProfile(new ColorProfile("D:\\MyProg\\cvetoprof\\JapanColor2002Newspaper.icc"));
// запись временного файла
image.Write("D:\\MyProg\\Temp\\tempFile.tiff");
//Чтение из временного файля для отображения в picturebox
pictureBox1.Image = (Bitmap)Image.FromFile("D:\\MyProg\\Temp\\tempFile.tiff");
pic = (Bitmap)pictureBox1.Image;
pictureBox1.Refresh();
this.Text += " " + " *JapanColor2002Newspaper";
}
- это все хлам который нас пока не интересует!
Давайте теперь подробно разберемся, что нам передается в метод!
Цитата Сообщение от Keramer82 Посмотреть сообщение
private void Tools_Click(object sender, EventArgs e)
Попробуйте ответить на вопрос: что такое object sender?
1
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
21.08.2019, 11:04 5
Лучший ответ Сообщение было отмечено Keramer82 как решение

Решение

Цитата Сообщение от Keramer82 Посмотреть сообщение
как добавить событие на нажатие любого пункта из подменю
C#
1
toolStripMenuItem1.DropDownItemClicked += DropDownItemClick;
C#
1
2
3
4
private void DropDownItemClick(object sender, ToolStripItemClickedEventArgs e)
{
 MessageBox.Show(e.ClickedItem.Text);
}
Добавлено через 3 минуты
Вот так к примеру получишь текст из подменю, в твоём случае название файла на который ты кликнул
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
21.08.2019, 11:42  [ТС] 6
Огромное спасибо, а то я что-то уперся, как в тупик, видимо спать когда-то нужно...
Только добавил в тело метода строку
C#
1
pToolStripMenuItem.DropDownItemClicked -= pDropDownItemClick;
а то при повторном нажатии на любой из подпунктов метод вызывался повторно. В частности, MessageBox.show() при 2-м нажатии выскакивал 2 раза, при 3-м нажатии — 3, и т.д. Если я неправильно сделал, и это решается как-то по другому, поправьте меня, пожалуйста. Программированием занимаюсь меньше месяца и многого еще не знаю.
0
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
21.08.2019, 11:54 7
Цитата Сообщение от Keramer82 Посмотреть сообщение
при повторном нажатии на любой из подпунктов метод вызывался повторно.
Вставь данный код в конструктор.
C#
1
toolStripMenuItem1.DropDownItemClicked += DropDownItemClick;
Вот так должно получиться

C#
1
2
3
4
5
public Form1()
        {
            InitializeComponent();
            toolStripMenuItem1.DropDownItemClicked += DropDownItemClick;
        }
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
21.08.2019, 12:15  [ТС] 8
Спасибо, теперь все работает, как нужно.
Вопрос, немного не по теме (для поднятия пока невысоких знаний в программировании на C# windows forms): в конструктор вставляются методы и переменные, которые инициализируются заново при каждом своем вызове, а до него — переменные, которые инициализируются только один раз при загрузке формы?
0
21.08.2019, 12:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2019, 12:15
Помогаю со студенческими работами здесь

Как перебрать подменю в MenuStrip
Собственно сабж.

Как обратиться к созданному listView
Здравствуйте. Пишу программу, и столкнулся с такой проблемой: Создаю listView вот так: new...

Как обратиться к динамически созданному объекту?
Всем привет, возникла проблема, пробую написать игру змейка, проблема при росте змейки, когда...

Как обратиться к динамически созданному элементу?
Помогите пожалуйста, не могу реализовать одну функцию. На форме TrackBar, под ним, вряд,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru