динамически созданный LinkButton onClick не запускает метод onclick

Я создаю X linkbuttons в коде позади, используя следующий код:

HTML:

<div runat="server" id="div_tables">

</div>               

Бэкэнд:

LinkButton lnkB = new LinkButton();
lnkB.ID ="LB" + row.ItemArray[1].ToString() + row.ItemArray[2].ToString();
lnkB.Text = "Link to episode";
lnkB.Attributes.Add("runat", "server");
lnkB.Click += new EventHandler(lb_Clicked);
div_tables.Controls.Add(lnkB);   

Метод OnClick:

protected void lb_Clicked(object sender, EventArgs e)
{
  LinkButton b = sender as LinkButton;
  b.Text = "ASD";
}

При щелчке по кнопке link перезагружается вся страница, а не только метод lb_Clicked. Я уверен, что это базовый вопрос, связанный со ссылками, но я очень надеюсь, что кто-нибудь сможет мне помочь. заранее спасибо

#

ИЗМЕНИТЬ, нашел этот другой пост, который дает решение проблемы: Не могу позвонить Нажмите "Событие" на динамической кнопке

Как правильно говорит Марк, данные теряются при загрузке страницы. В этом сообщении предлагается использовать viewstate только для воссоздания желаемой кнопки.


person Helmer    schedule 29.03.2015    source источник


Ответы (1)


Вся страница всегда будет перезагружаться. Имейте в виду, что после обслуживания страницы ее больше нет. Когда вы нажимаете кнопку, он передает все обратно на сервер. Затем сервер раскручивает страницу, просматривает ее события, а затем обрабатывает соответствующую обратную передачу, такую ​​как событие нажатия кнопки ссылки.

Если вы хотите убедиться, что какой-то другой код не запускается, например код в OnLoad, вы должны заключить его в оператор if, например:

if(!Page.IsPostBack)
{
   // only do things the first time the page is laoded.
}

Кроме того, при создании динамических элементов управления вы должны воссоздавать их каждый раз, когда страница отправляет обратно, и на достаточно раннем этапе жизненного цикла страницы, чтобы они действительно существовали вовремя, чтобы получить событие обратной передачи. OnLoad или OnPreLoad - самые последние события, в которых вы должны это делать (не используйте Page_Load, поскольку это происходит после OnLoad и обычно происходит слишком поздно).

Для упрощения обработки, например, если у вас есть кнопка ссылки, которая что-то делает с записью, вы можете посмотреть событие Command. Это ведет себя так же, как и щелчок, но дает вам доступ к CommandName и CommendArgument, которые вы можете установить на кнопке ссылки и использовать для передачи информации, такой как идентификатор выбранной записи.

person Mark Fitzpatrick    schedule 29.03.2015
comment
Метод, который создает таблицы, уже находится в if (! IsPostBack) {CrateTables ();) - person Helmer; 29.03.2015
comment
На самом деле, после прочтения вашего сообщения оказалось, что простым (не дружественным к ресурсам) решением было бы удалить! Page.ispostback. - person Helmer; 29.03.2015