Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
1

ToolStripMenuItem получить данные откуда вызвано меню

26.07.2016, 15:24. Просмотров 2093. Ответов 22
Метки нет (Все метки)

Добрый день, Товарищи. Я наверное всем уже надоел) но пытаюсь не задавать повторяющиеся моменты. Предварительно пытаюсь найти ответы.

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

Меню креплю с помощью свойств лист бокса привязки контекст меню.
vb.net
1
2
3
    Private Sub ДобавитьToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ДобавитьToolStripMenuItem.Click
        ListBox1.Items.Add(InputBox("Что добавить?"))
    End Sub
Спасибо большое!) Всегда ставлю плюсики)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2016, 15:24
Ответы с готовыми решениями:

Откуда вызвано контекстное меню?
Допустим у меня есть несколько текстовых полей на форме и одно контекстное меню. Я хочу выделять...

как получить экранные координаты пунка меню ToolStripMenuItem
Хочу получить координаты пункта меню ToolStripMenuItem, т.е. точку Point его верхнего левого угла....

Откуда вызвано действие
Как можно получить\передать, какой элемент вызвал функцию например:...

Запуск процедуры из меню ToolStripMenuItem
Среда Visual Basic STUDIO’2010 Professional К пункту меню прикреплён код Private Sub...

22
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 15:57 2
несовсем понятен вопрос.
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 16:00  [ТС] 3
Yury Komar, Я сделал меню, кликая по "добавать" Он добавляет строку в лист бокс.
Как сделать так, что бы он добавлял строку в тот лист бокс, откуда это меню было вызвано.

vb.net
1
2
3
 Private Sub ДобавитьToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ДобавитьToolStripMenuItem.Click
        ОТКУДА НАС ВЫЗВАЛИ??????.Items.Add(InputBox("Что добавить?"))
    End Sub
0
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 16:28 4
опять неверная формулировка... У вас ОТКУДА ВЫЗВАЛИ получается местом КУДА ДОБАВИТЬ. Вместо вопросов в коде впишите имя вашего ListBox.
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 16:30  [ТС] 5
Yury Komar, Так ОТКУДА ВЫЗВАЛИ = КУДА ВПИСЫВАЕМ. Я об этом и говорю, что нужно вставить туда, откуда мы вызвали.
Если вызвали с первого бокса, то
vb.net
1
listbox1.Items.Add(InputBox("Что добавить?"))
а если со второго , то
vb.net
1
listbox2.Items.Add(InputBox("Что добавить?"))
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 16:34  [ТС] 6
Yury Komar, Это я вызываю одно меню, но хочу что бы добавил ячейки туда, откуда я его вызвал.
0
Миниатюры
ToolStripMenuItem получить данные откуда вызвано меню  
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 16:37 7
тогда вместо имени бокса напишите SENDER и все

Добавлено через 44 секунды
если не ошибаюсь
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 16:40  [ТС] 8
Yury Komar,
"Дополнительные сведения: Общий член "Items" для типа "ToolStripMenuItem" не найден."
сендер нас отсылает к клику тул стрипса
0
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 16:41 9
Лучший ответ Сообщение было отмечено ctac1412 как решение

Решение

либо в доп переменной держите имя бокса на котором был MouseDown, далее это имя передайте в ваш код через это
vb.net
1
CType(Me.Controls(ПЕРЕМЕННАЯ),ListBox).Items.Add(InputBox("Что добавить?"))
Добавлено через 39 секунд
да я уже понял... решение выше представил.
2
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 16:43  [ТС] 10
Yury Komar, Как вариант. Спасибо!
0
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 16:46 11
либо может быть можно у
vb.net
1
ContextMenu.Parent
можно получить имя ЛистБокса
0
Почетный модератор
21174 / 8908 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
26.07.2016, 17:30 12
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Ну и до кучи, это SourceControl, т.е. компонент, который отображает меню в данный момент
vb.net
1
2
3
    Private Sub ДобавитьСтрокуToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ДобавитьСтрокуToolStripMenuItem.Click
        CType(ContextMenuStrip1.SourceControl, ListBox).Items.Add(Now.ToLongTimeString)
    End Sub
Добавлено через 1 минуту
Цитата Сообщение от Yury Komar Посмотреть сообщение
ContextMenu.Parent
У меня не вышло
3
Модератор
Эксперт .NET
3058 / 2751 / 437
Регистрация: 27.01.2014
Сообщений: 5,038
26.07.2016, 19:21 13
Памирыч, я это и имел ввиду:
vb.net
1
ContextMenuStrip1.SourceControl
просто студии под рукой небыло чтоб глянуть точное название. Спасибо за подсказку. считаю ваше решение удачнее моего, так как исключается наличие лишних движений с отловом компонента, который вызвал менюшку.
0
Почетный модератор
21174 / 8908 / 1080
Регистрация: 11.04.2010
Сообщений: 11,014
26.07.2016, 19:55 14
Цитата Сообщение от Yury Komar Посмотреть сообщение
ваше решение удачнее моего, так как исключается наличие лишних движений с отловом компонента
Больше решений хороших и разных (с)
1
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
26.07.2016, 22:53  [ТС] 15
выкладываю решение для использования одного меню, для разных контролов и фильтрации не нужных. Что бы не плодить их, как было сказанно где то на просторах....

Изначально должны быть добавлены все кнопки которые мы покажем. Действие прописываю так.

vb.net
1
2
3
    Private Sub Лист1_Click(sender As Object, e As EventArgs) Handles Лист1.Click
        MsgBox("кнопка лист1")
    End Sub
vb.net
1
2
3
    Private Sub ToolStripMenuItem3_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem3.Click
        MsgBox("Суб кнопка от ЛИСТ1")
    End Sub
П.с. Не понимаю почему, но на субменю (когда два раза жмешь и переходит к коду) переходит с глюками.... Не имеет своего имени, а получает порядковый номер по мере добавления "Item3"

vb.net
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
    Private Sub listboxmenustrip()
        ContextMenuStrip1.Items.Clear()
        ContextMenuStrip1.Items.AddRange((New _
   System.Windows.Forms.ToolStripItem() {Me.Лист1,
      Me.Лист2}))
 
    End Sub
    Private Sub lTextBoxmenustrip()
        ContextMenuStrip1.Items.Clear()
        ContextMenuStrip1.Items.AddRange((New _
   System.Windows.Forms.ToolStripItem() {Me.Текст1,
      Me.Текст2}))
 
    End Sub
 
    Private Sub ContextMenuStrip1_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
        If ContextMenuStrip1.SourceControl.ToString = "System.Windows.Forms.ListBox" Then
 
            MsgBox("Сейчас загрузится Пакет меню для листбоксом")
            listboxmenustrip()
        ElseIf ContextMenuStrip1.SourceControl.ToString Like "System.Windows.Forms.TextBox*" Then
            MsgBox("Сейчас загрузится Пакет меню для текст бокс")
            lTextBoxmenustrip()
        Else
            MsgBox(ContextMenuStrip1.SourceControl.Text)
        End If
    End Sub
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
27.07.2016, 16:57  [ТС] 16
Памирыч, Yury Komar, с помощью,
vb.net
1
ContextMenuStrip1.SourceControl
можно отловить клик лишь по первому уровню меню.
Возможно ли без переменных выловить второй и т.д. уровни меню?

у ToolStripMenu нет SourceControl..

То бишь
vb.net
1
MsgBox(ContextMenuStrip1.SourceControl.Name.ToString)
с первого уровня возвращает нам все верно, но со с второго уже ссылается на не существование.
0
Миниатюры
ToolStripMenuItem получить данные откуда вызвано меню  
1236 / 1171 / 279
Регистрация: 03.10.2012
Сообщений: 1,238
27.07.2016, 17:09 17
Цитата Сообщение от ctac1412 Посмотреть сообщение
у ToolStripMenu нет SourceControl
Зато у него есть свойство ToolStripMenuItem1.Owner
1
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
27.07.2016, 21:38  [ТС] 18
MrCrown, как это можно использовать?

MsgBox(ToolStripMenuItem4.Owner.ContextM enu.SourceControl.Name.ToString) ??? мне кажется мысль не та

Добавлено через 3 часа 34 минуты
Решил так...
vb.net
1
2
3
    Private Sub ToolStripMenuItem4_MouseDown(sender As Object, e As MouseEventArgs) Handles ToolStripMenuItem4.MouseDown
        MsgBox(whereIam)
    End Sub
vb.net
1
2
3
4
5
6
    Private Function whereIam()
        Dim x
        x = ContextMenuStrip1.SourceControl.Name.ToString()
 
        Return x
    End Function
Добавлено через 39 минут
Нет, я пошутил.
0
1 / 1 / 0
Регистрация: 15.12.2016
Сообщений: 12
13.12.2018, 02:16 19
Коллеги, доброго времени суток. Позвольте приподнять тему. прочитал, опробовал - все равно не получается.

Дано: на форме есть TabControl, на котором куча Label'ов с именами lbl_номер (могут идти не подряд).
На каждый из Label есть ContextMenuStrip. Менюшка простая, например, 2 пункта: "красный" и "зеленый".
Задача: при вызове меню закрасить данный Label цветом, который указал юзер.
Проблема: не дает имени label'а, на котором вызывается меню (имя по-любому затем понадобиться для других действий...)

тут попытался получить имя, но ругается, что "System.NullReferenceException : "Ссылка на объект не указывает на экземпляр объекта."
vb.net
1
2
3
Private Sub RedToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles RedToolStripMenuItem.Click
        MsgBox(ContextMenuStrip.SourceControl.Name.ToString)
    End Sub
Вариации с CType тот же результат.
vb.net
1
CType(ContextMenuStrip.SourceControl, Label).BackColor = Color.Black
(мало знаком с конкретно этой шляпой).

В общем, нид хелп!!! +100500 к карме
0
391 / 310 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
13.12.2018, 09:36 20
Цитата Сообщение от prokudinsk Посмотреть сообщение
тут попытался получить имя, но ругается, что "System.NullReferenceException : "Ссылка на объект не указывает на экземпляр объекта."
Отловить имя пункта меню, можно примерно так:
vb.net
1
2
3
4
5
    Private Sub ToolStripDropDownButton_DropDownItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ToolStripDropDownButton.DropDownItemClicked
        If e.ClickedItem.Text = "Название меню" Then
            '...
        End If
    End Sub
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2018, 09:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Клик одного ToolStripMenuItem должен вызвать код другого ToolStripMenuItem
Добрый день всем! Подскажите пожалуйста, кто может! C# В форме есть меню, по нажатию мышью...

Динамическое создание ToolStripMenuItem: Нельзя применить индексацию к ToolStripMenuItem
Пробовал стандартными методами, вышла ошибка, что нельзя применить индексацию к ToolStripMenuItem....

Уменьшение ширины пунктов контекстного меню (ToolStripMenuItem)
всем приветы. Добавлено через 11 минут всем приветы. текст пунктов и подпунктов контекстного...

MenuStrip и прочее меню созданное в VS - программный поиск ToolStripMenuItem и добавление в него новых пунктов
Друзья, устал... Сил нет, а от того просьба в поиске простого решения: Раньше, в паре проектов,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.