Как обрабатывать пункты меню в C # для передачи значений - PullRequest
2 голосов
/ 18 ноября 2010

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

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 в качестве глобальных переменных, но у меня много таких переменных, как эта.Если я воспользуюсь этим подходом, переменные будут жить, пока форма не будет уничтожена.Так что это не работает.Есть ли другой способ добиться этого?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

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

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];
    ...
}
4 голосов
/ 18 ноября 2010

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

...