2013-06-24 3 views
5

Этот вопрос задан много раз, но решение по какой-то причине не работает.Передача аргументов методу в EventHandler

Я динамически создаю кнопку и назначаю ей EventHandler.

protected void Page_Load (object sender, EventArgs e) 
{ 
    Button b = new Button(); 
    b.Click += new EventHandler(Method); 
} 

protected void Method (object sender, EventArgs e) 
{ 
    //Do work here 
} 

мне нужно передать аргумент, так что самый простой способ, которым я думал был такой:

b.Click += new EventHandler(Method(sender, e, "name")); 

protected void Method (object sender, EventArgs e, String name) 
{ 
    //Do work here 
} 

Error: Method name expected

Таким образом, после проверки на вопросы здесь, я нашел то же самое решение практически любой вопрос ,

b.Click += new EventHandler((sender, e) => Method(sender, e, "name")); 

Так я изменил следующее:

b.Click += new EventHandler((sender1, e1) => Method(sender1, e1, "name")); 

и ошибка из Visual Studio не было, но при запуске веб-страницу, я получил эту ошибку:

System.ArgumentOutOfRangeException: Index was out of range. Must be a non-negative and less than the size of the collection.

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

+0

Является ошибкой 'ArgumentOutOfRangeException' на этой строке EventHandler или в другом месте? – keyboardP

+0

Возможно, есть ссылка на код с ArgumentOutOfRangeException. Вы должны показать это здесь. – spender

+0

@keyboardP Да именно на линии EventHandler. –

ответ

2

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

+0

Спасибо, проблема была совсем чем-то еще, я чувствую себя такой глупой. –

0

Если вы подписаны на мероприятие Button.Click, у вас нет выбора, так как ваш индекс должен следовать за соответствующим шаблоном делегата. Другими словами, вы не можете добавить наши настраиваемые параметры даже для обработчика, так как подпись вашего обработчика должна точно соответствовать типу делегата, определенному в событии, которое вы слушаете.

Таким образом, чтобы передать параметр:

  • или определить глобальное переменное состояние, и прочитать его из тех же обработчика событий
  • или определить некоторые пользовательские обработчик событий, с некоторыми пользовательскими событиями аргументом
+0

Я пытаюсь сохранить состояние, но не могу найти соответствующую переменную для его сохранения. Некоторые говорят, что тип переменной должен быть Action, в то время как некоторые говорят, что это Func. ShapeNodeEventArgs shapeNodeArgs = new ShapeNodeEventArgs (shapeHit.Tag как DeviceMap); mnuShapeLogicalGrid.Click + = (s, ev) => {displayDeviceLogicalData (отправитель, shapeNodeArgs);}; frmDisplay.ContextMenuStrip = ctxtGridStrip; Это было обсуждено на SO, но я пока не могу понять тип переменной. Все комментарии могут быть отправлены. –