Вот что я хочу сделать:

 .... 
for(i=0;i<=99;i++)
        {
            btn[i].Click += new EventHandler(btn_Clicked,i);
        }
    }

    private void btn_Clicked(object sender, EventArgs e,int i)
    {
        compute((Button)sender, picRetrieved[i]);
    }

Пожалуйста помоги. Это показывает ошибку. Но я хочу отправить значение i для дальнейшей обработки. Есть ли способ это сделать?

Спасибо.

1
Kountay Dwivedi 27 Фев 2015 в 17:04

2 ответа

Лучший ответ

Благодаря закрытию и анонимным функциям вы можете делать нечто подобное:

for(int i=0;i<=99;i++)
{
    int j = i;
    btn[i].Click += (sender, e) => 
    {
        // Very important! Here use only j, not i!
        compute((Button)sender, picRetrieved[j]);
    };
}

Есть небольшая "проблема" (это не проблема, дело в том, как они выполняются), так что вы не должны использовать переменную i внутри анонимной функции, но если вы скопируете ее в другое место (j например), то вы можете использовать j.

4
Community 23 Май 2017 в 12:06

Вы не можете. Подпись обработчика событий фиксированная, изменить ее нельзя.

В этом случае вы можете использовать анонимного делегата, чтобы получить то, что хотите.

for(i = 0; i <= 99; i++)
{
    int dummy = i;
    btn[i].Click += delegate(object sender, EventArgs e)
        {
            compute(btn[dummy], picRetrieved[dummy]);
        }
}

Другой вариант - «пометить» кнопку:

for(i = 0; i <= 99; i++)
{
    btn[i].Click += btn_Clicked;
    btn[i].Tag = i;
}

private void btn_Clicked(object sender, EventArgs e,int i)
{
    Button b = (Button)sender;
    int i = (int)b.Tag;

    compute(b, picRetrieved[i]);
}
2
Patrick Hofman 27 Фев 2015 в 14:09