динамично създаденият 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";
}

При щракване върху linkbutton цялата страница се презарежда вместо само метода lb_Clicked. Сигурен съм, че това е основен въпрос за linkbutton, но наистина се надявам някой да може да ми помогне. Благодаря ви предварително

#

РЕДАКТИРАНЕ, Намерих тази друга публикация, която дава решение на проблема: Не мога да се обадя Щракнете върху Събитие върху динамичен бутон

Както Марк правилно казва, данните се губят при зареждането на страницата. Тази публикация предлага да използвате 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 и обикновено е твърде късно).

За по-лесна обработка, като например ако накарате бутона за връзка да направи нещо със запис, може да искате да погледнете събитието на командата. Това се държи като щракването, но ви дава достъп до CommandName и CommendArgument, които можете да зададете на бутона за връзка и да използвате за предаване на информация като ID на избран запис.

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