Вот что я хочу сделать:
....
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 для дальнейшей обработки. Есть ли способ это сделать?
Спасибо.
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
.
Вы не можете. Подпись обработчика событий фиксированная, изменить ее нельзя.
В этом случае вы можете использовать анонимного делегата, чтобы получить то, что хотите.
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]);
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.