Перехват события нажатия для программно сгенерированного подменю контекстного меню - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь поймать событие щелчка в подменю контекстного меню, которое динамически создается с помощью следующего кода. Контекстное меню cmList создается в конструкторе, а код события клика добавляется из меню свойств.

for (int i = 0; i <= sTagsContext.GetUpperBound(0); i++)
{
    cmListTags.Items.Add(sTagsContext[i]);
    ToolStripMenuItem submenu = new ToolStripMenuItem();                  
    submenu.Text = i.ToString();
    submenu.Image = Properties.Resources.InfoBig;

    (cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(submenu);                    
     chkListTags.ContextMenuStrip = cmListTags;
}

Как создать код, который будет выполняться при щелчке по подменю любого из элементов контекстного меню и наличии идентификатора элемента подменю (установленного в свойстве text)?

Я попытался добавить обработчик событий, используя

(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new EventHandler(InfoClicked));

где я создаю функцию

public void InfoClicked(object sender, EventArgs e)
{
}

Эта функция вызывается при щелчке по подменю, но ни отправитель, ни e не имеют никакой информации о щелчке по элементу подменю - отправитель равен нулю, а e пусто.

Если я задаю e для типа ToolStripItemClickedEventArgs и изменим строку добавления Dropdown на

(cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(i.ToString(), Properties.Resources.InfoBig, new ToolStripItemClickedEventHandler(InfoClicked));

Я получаю несоответствие типов времени компиляции для последнего параметра DropDownItems.Add.

1 Ответ

0 голосов
/ 30 октября 2018

Вы можете использовать анонимный метод - тело метода без имени.

int index = i;
cmListTags.Items[i] as ToolStripMenuItem).DropDownItems.Add(
     i.ToString(), 
     Properties.Resources.InfoBig, 
     (s, args) => {
         MessageBox.Show(index.ToString(); 
} ));

Поскольку анонимный метод объявлен вместо , он имеет доступ к локальной переменной i . Таким образом, вам не нужно использовать sender .

Редактировать : Оказывается, i изменяется в цикле for. Поэтому я должен использовать локальную копию index , чтобы сохранить ее значение.

А что касается вашего второго вопроса,

Я получаю несоответствие типа времени компиляции для последнего параметра DropDownItems.Add.

Это потому, что подпись InfoClicked не совпадает с подписью делегата ToolStripItemClickedEventHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...