Как обрабатывать пункты меню в C # для передачи значений

#c# #winforms #contextmenu #menuitem

#c# #winforms #contextmenu #menuitem

Вопрос:

Я работаю в Windows Forms на C #. У меня есть метод, в котором я добавляю MenuItem s к ContextMenu , и я реализовал обработчики событий для MenuItem них, как показано ниже:

 public void Form1_Load()
{
    int index = 0;
    ArrayList ar = new ArrayList();
    ContextMenu cm = new ContextMenu();
    cm.Name = "Test";
    MenuItem mi = new MenuItem("All");
    mi.Click  = new EventHandler(mi_All);
}

private void mi_All(object sender, EventArgs e)
{
    // Here I want to access the arraylist and integer specified in above method
}
  

Как это можно сделать? Одним из возможных решений является объявление ArrayList и int как глобальных переменных, но у меня есть много переменных, подобных этой. Если я использую этот подход, переменные будут действовать до тех пор, пока форма не будет удалена. Итак, это не работает. Есть ли другой способ добиться этого?

Комментарии:

1. Вопрос в том, зачем вам нужен доступ к списку массивов? Рассмотрите возможность использования свойства tag элемента меню для дополнительного хранилища.

Ответ №1:

Один из вариантов:

 mi.Click  = delegate (object sender, EventArgs e) { mi_All(sender, e, ar, index); };
...
private void mi_All(object sender, EventArgs e, ArrayList ar, int index)
{
   ...
}
  

Другой:

 mi.Tag = new object[] { ar, index };
...
private void mi_All(object sender, EventArgs e)
{
    ArrayList ar = (ArrayList)((object[])((MenuItem)sender).Tag)[0];
    int index = (int)((object[])((MenuItem)sender).Tag)[1];
    ...
}
  

Комментарии:

1. Я могу сделать это для доступа. Спасибо за решение. Аналогично, если я хочу вернуть индекс, который будет обновлен в методе обработчика событий, для этого существует любой способ. Пожалуйста, дайте мне знать.

Ответ №2:

У MenuItem есть Tag свойство, которое можно использовать для назначения любой пользовательской информации, которая вам нравится. Поэтому назначьте этому все, что вам нужно для доступа при вызове обработчика событий. В вашем примере вы бы назначили целочисленный индекс элемента enu, а затем внутри обработчика событий использовали бы его в качестве индекса в поле ArrayList уровня формы.