Привязать обработчики событий в цикле - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь привязать события к динамически создаваемому событию click пункта меню, которое создается в цикле for. Когда я щелкаю по пункту меню, код выполняется, но он с последним значением «x» в цикле. Это код:

        for(int x = 1; x < 3; x++)
        {
            MenuItem mi = new MenuItem("Get");
            ContextMenu cm = new ContextMenu();
            mi.Click += (s, e) => { GetClick(x); };
            cm.MenuItems.Add(mi);
            Button btn = this.Controls.Find("btnGet" + x.ToString(), true).FirstOrDefault() as Button;
            btn.ContextMenu = cm;

        }

    private void GetClick(int intGetItem)
    {
        //Previous code...

        GetItem(intGetItem);
    }

Проблема в том, что когда я отлаживаю метод GetClick, intGetItem всегда равен 3 независимо от того, какую кнопку я использую. Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы не можете определить параметры события, когда регистрируетесь на него.Вместо этого вы должны передать параметры, которые будет предоставлять пункт меню.

mi.Click += GetClick;

И изменить свое событие, чтобы получить стандартные параметры Click:

private void GetClick(object sender, EventArgs e)
{
    if (sender == menu1) {...
0 голосов
/ 16 ноября 2018

Вам необходимо присвоить x локальной переменной и использовать это в своем выражении:

var y = x;
mi.Click += (s, e) => { GetClick(y); };

вот объяснение: https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

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