#c# #asp.net #events #event-handling
#c# #asp.net #Мероприятия #обработка событий
Вопрос:
Этот код из одного класса
Button pagebtn = new Button();
pagebtn.Text = "2";
pagebtn.Click =
listTopicPerPage_Click(this, new btnEventArgs() { btnNumber = 2 });
Я получаю подчеркивание в методе EventHandler, говорящем..
не удается безоговорочно преобразовать тип ‘void’ в ‘System.Обработчик событий’.
Почему это?
Код из другого класса, который я создал:
class btnEventArgs : EventArgs
{
public int btnNumber { get; set; }
}
Ответ №1:
Чтобы указать параметры события, вы должны создать поле события в своем классе и вызывать его по требованию:
public partial class WebForm1 : System.Web.UI.Page
{
public event EventHandler<btnEventArgs> SampleEvent;
public void DemoEvent(int val)
{
// Copy to a temporary variable to be thread-safe.
EventHandler<btnEventArgs> temp = SampleEvent;
if (temp != null)
temp(this, new btnEventArgs { btnNumber = val });
}
protected void Page_Load(object sender, EventArgs e)
{
Button1.Click = new EventHandler(Button1_Click);
}
void Button1_Click(object sender, EventArgs e)
{
DemoEvent(2);
}
}
class btnEventArgs : EventArgs
{
public int btnNumber { get; set; }
}
Комментарии:
1. Я не совсем уверен, что вы там сделали. Но, я полагаю, вы хотите, чтобы я создал новый метод .. и делал это долго .. не уверен, что это необходимо
2. Вы не можете передать параметры при назначении делегата. Итак, вы должны создать свой собственный метод для переноса события
3. Зачем методу нужен параметр string val и что такое SampleEvent?
4. Прочитайте статью MSDN, пожалуйста :). Какой просто псевдокод, чтобы показать вам, как вы должны выполнять назначение события
5. Этого не произойдет. Я пытался сказать, что вы не можете передать ему данные здесь. btn.Click может быть предоставлен только метод, а не значения для передачи методу. При возникновении события btn.Click передаются данные параметра. Это делается фреймворком при нажатии кнопки. Здесь вы не можете это контролировать.
Ответ №2:
просто попробуйте это:
pagebtn.Click = new EventHandler(listTopicPerPage_Click);
Комментарии:
1. Но listTopicPerPage_Click() не реализован / определен. 😀
Ответ №3:
это потому, что ваша сигнатура метода listTopicPerPage_Click выглядит примерно так
protected void listTopicPerPage_Click( object sender, EventArgs e )
Здесь есть пара вещей, которые вы можете сделать,
Вы можете обновить сигнатуру вашего метода, чтобы использовать btnEventArgs вместо EventArgs
protected void listTopicPerPage_Click( object sender, btnEventArgs e )
или вы можете преобразовать свои новые btnEventArgs в EventArgs, а затем преобразовать их обратно в btnEventArgs в теле метода.
pagebtn.Click =
listTopicPerPage_Click(this, (EventArgs) new btnEventArgs() { btnNumber = 2 });
protected void listTopicPerPage_Click( object sender, EventArgs e )
{
btnEventArgs bea = (btnEventArgs) e;
...
}
Комментарии:
1. ни одна из вышеперечисленных проблем не решает вопрос я уже изменил EventArgs на btnEventArgs в методе eventhandler
2. @Matrix001, если у вас есть btnEventArgs в обработчике событий, то вы приводите e к btnEventArgs для доступа к btnNumber.
3. Это не будет компилироваться: pagebtn.Click = listTopicPerPage_Click(this, (EventArgs) new btnEventArgs() { btnNumber = 2 });
4. pagebtn.Click = listTopicPerPage_Click(this, (EventArgs)new btnEventArgs() { btnNumber = i }); Я сделал это, он по-прежнему показывает подчеркивание с тем же комментарием, что и раньше.
5. Это также не компилируется. Вы не возвращаете делегат. pagebtn.Click = listTopicPerPage_Click(this, (EventArgs)новый btnEventArgs() { btnNumber = i });
Ответ №4:
Редактировать
pagebtn.Click = listTopicPerPage_Click;
Комментарии:
1. это не сработало бы, потому что таким образом btnNumber не определен.
2. Это также не определено в его примере, но это не значит, что этого нет в коде. В любом случае, на самом деле проблема не в этом. Вы также можете утверждать, что ни один из кодов не будет работать, учитывая, что у него нет инструкций using для соответствующих пространств имен.
3. Это вызовет анонимный метод, в котором будет инициализирован просто btnNumber. Это закрытие не является решением для этого
4. тем не менее, число, которое я пытаюсь передать, не определено
5. Вы определяете EventArgs при создании события. Поскольку вы, скорее всего, не можете вызвать событие (они могут быть вызваны только внутри объекта), вы захотите определить btnNumber другим способом.