Проблема с динамическими элементами управления
Привет всем,
Я хочу создать некоторые динамические элементы управления и удержать их в представлении на разных страницах. Легко, правда? Все, что мне нужно сделать, это воссоздать элементы управления при каждой загрузке страницы, используя те же идентификаторы. ОДНАКО, вот уловка в моем событии PreRender, я хочу очистить коллекцию элементов управления, а затем воссоздать динамические элементы управления с новыми значениями. Причины этого сложны, и, вероятно, мне понадобится страница или около того, чтобы объяснить, почему я хочу это сделать. Поэтому, в интересах краткости, позвольте предположить, что я абсолютно должен это сделать, и что нет другого пути.
Проблема возникает после того, как я снова создаю элементы управления в своем событии PreRender. Повторно созданные элементы управления никогда не привязаны к представлению, и их значения не сохраняются при загрузке страниц. Я не понимаю, почему это происходит. Я уже создаю элементы управления в своем событии OnLoad. Когда я это делаю, вновь созданные элементы управления привязываются к ViewState просто отлично, при условии, что я использую одинаковые идентификаторы каждый раз. Однако, когда я пытаюсь сделать то же самое в событии PreRender, он терпит неудачу.
В любом случае, вот мой пример кода:
пространство имен TestFramework.WebControls {
public class ValueLinkButton : LinkButton
{
public string Value
{
get
{
return (string)ViewState[ID + "vlbValue"];
}
set
{
ViewState[ID + "vlbValue"] = value;
}
}
}
public class TestControl : WebControl
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Controls.Clear();
ValueLinkButton tempLink = null;
tempLink = new ValueLinkButton();
tempLink.ID = "valueLinkButton";
tempLink.Click += new EventHandler(Value_Click);
if (!Page.IsPostBack)
{
tempLink.Value = "old value";
}
Controls.Add(tempLink);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ValueLinkButton tempLink = ((ValueLinkButton)FindControl("valueLinkButton")); //[CASE 1]
//ValueLinkButton tempLink = new ValueLinkButton(); [CASE 2]
tempLink.ID = "valueLinkButton";
tempLink.Value = "new value";
tempLink.Text = "Click";
Controls.Clear();
Controls.Add(tempLink);
}
void Value_Click(object sender, EventArgs e)
{
Page.Response.Write("[" + ((ValueLinkButton)sender).Value + "]");
}
}
}
Итак, рассмотрим случай 1, где строка рядом с [CASE 1] не закомментирована, но строка рядом с [CASE 2] закомментирована. Здесь все работает отлично. Когда я помещаю этот элемент управления на страницу и загружаю страницу, я вижу ссылку, которая говорит "Click". Когда я нажимаю ссылку, страница выводит текст "[новое значение]", а на следующей строке мы видим знакомую ссылку "Click". Каждое подчиненное время, которое я нажимаю на ссылку "Click", мы видим одно и то же. Пока что так хорошо.
Но теперь рассмотрим случай 2, где строка рядом с [CASE 1] закомментирована, но строка рядом с [CASE 2] не закомментирована. Здесь мы сталкиваемся с проблемами. Когда мы загружаем страницу, мы видим ссылку "Click". Однако, когда я нажимаю на ссылку, страница выводит текст "[]" вместо "[новое значение]". Событие клика срабатывает нормально. Однако текст "нового значения", который я присвоил атрибуту Value элемента управления, не сохраняется. Еще раз, это немного загадка для меня. Почему, когда я воссоздаю элемент управления в OnLoad, все отлично и денди, но когда я воссоздаю элемент управления в PreRender, значение не сохраняется?
Я чувствую, что просто должен быть способ сделать это. Когда я снова создаю элемент управления в PreRender, есть ли способ связать вновь созданный элемент управления с ViewState?
Я боролся с этим в течение нескольких дней. Любая помощь, которую вы можете дать мне, будет оценена.
Спасибо.