Динамически загружаемый элемент управления - как я могу получить доступ к значению в Page_Init - PullRequest
4 голосов
/ 29 марта 2009

Я загружаю LinkButton динамически, когда пользователь нажимает на другую LinkButton. Я прикрепляю к нему обработчик событий. Когда пользователь нажимает на динамически загруженную ссылку LinkButton, событие не запускается.

Из того, что я читал, я понимаю, что это потому, что когда страница отправляет обратно, динамически загруженный элемент управления больше не существует. Похоже, я должен убедиться, что этот элемент управления воссоздан в Page_Init.

Динамически создаваемый LinkButton зависит от значения (ID продукта). Мне нужно как-то получить доступ к этому значению, чтобы я мог правильно создать элемент управления. ViewState недоступен, и я обеспокоен, если я использую Session, он может истечь, и тогда это не поможет. Есть идеи?

Кроме того, я жестко закодировал значение ID продукта только для тестирования, и это все равно не вызвало событие. Есть ли что-то еще, что мне нужно сделать?

protected void Page_Init(object sender, EventArgs e)
{
   SetTabText(1, 1);
}

SetTabText вызывает SetActionLinks, который создает LinkButton:

protected Panel SetActionLinks(int prodID, int tabID) {
...
LinkButton lnkBtn = new LinkButton();
lnkBtn.ID = "lnkBtn" + rand.Next().ToString();
lnkBtn.CommandName = "action";
lnkBtn.Command += new CommandEventHandler(this.lnkAction_Command);
panel.Controls.Add(lnkBtn);
...
}
void lnkAction_Command(object sender, CommandEventArgs e)
{
   LinkButton btn = (LinkButton)sender;
   switch (btn.CommandArgument)
   {
      AddCart();
   }
}

Ответы [ 6 ]

6 голосов
/ 29 марта 2009

Вы можете поместить свой идентификатор продукта в скрытое поле и получить его значение в Page_Init, используя

Page.Request(Page.FindControl("hdnPageIdField"))

Таким образом, вам не нужно полагаться на ViewState или SessionState

Также для динамического управления я настоятельно рекомендую вам прочитать эту серию отличных арктик

2 голосов
/ 29 марта 2009

В вашем сценарии я попробовал ваш код, строка ниже вызывает ошибку вашего события:

lnkBtn.ID = "lnkBtn" + rand.Next().ToString();

попытаться установить идентификатор, который не изменяется между постбэками.

Для ViewState Вы можете переместить свой код в Page_Load. Ваш код работает так же, но вы можете получить доступ к ViewState и опубликованным значениям вашего элемента управления

1 голос
/ 10 мая 2012

Это работает в Page_Init

HiddenField ctrl = (HiddenField)Page.FindControl("hfTest");
string strValue = Page.Request.Form.Get(ctrl.ClientID);

HiddenField будет хранить элементы управления для загрузки (с разделителями труб), и мы можем загружать элементы управления динамически.

1 голос
/ 05 июня 2009

Я провел бессонную ночь, придумывая что-то подобное несколько месяцев назад. Именно тогда я полностью осознал тот факт, что ASP.NET построен на основе без сохранения состояния и поддерживает состояние путем просмотра состояния пинг-понга между клиентом и сервером.

Если вы динамически добавляете и удаляете элементы управления или изменяете существующие элементы управления в ответ на срабатывание события динамически созданного элемента управления, то PageInit родительского элемента должен воссоздать дочерние элементы управления в состоянии, в котором они существовали в момент срабатывания события действия события применяются). Это может показаться избыточным, но это необходимо для того, чтобы гарантировать, что получатель существует, и его обработчик может быть вызван, когда сервер хочет запустить событие. Затем обработчик событий элемента управления сможет применить изменения (и добавить или удалить элементы управления, назначить разные идентификаторы и т. Д.)

Я нашел эту страницу в жизненном цикле событий ASP.NET (http://msdn.microsoft.com/en-us/library/ms178472.aspx) полезно.

0 голосов
/ 30 марта 2009

Есть ли у вас AutoEventWireup="true" в вашем файле .aspx?

0 голосов
/ 29 марта 2009

Посмотрите на анонимных делегатов

LinkButton lb = new LinkButton();
lb.Command += delegate { // do something here. also you can access any variable from current stack };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...