Проблема с динамическими элементами управления
Привет всем,
Я хочу создать некоторые динамические элементы управления, чтобы они сохраняли свое состояние просмотра при загрузке страницы. Достаточно просто, правда? Все, что мне нужно сделать, это заново создать элементы управления при каждой загрузке страницы, используя те же идентификаторы. ОДНАКО, вот подвох - в моем событии PreRender я хочу очистить коллекцию элементов управления, а затем воссоздать динамические элементы управления с новыми значениями. Причины этого сложны, и мне, вероятно, понадобится около страницы, чтобы объяснить, почему я хочу это сделать. Итак, в интересах краткости, давайте просто предположим, что я абсолютно обязан это сделать, и что другого пути нет.
Проблема возникает после того, как я заново создаю элементы управления в моем событии PreRender. Воссозданные элементы управления никогда не привязываются к состоянию просмотра, и их значения не сохраняются при загрузке страницы. Я не понимаю, почему это происходит. Я уже воссоздаю элементы управления в моем событии OnLoad. Когда я делаю это, вновь созданные элементы управления связываются с ViewState очень хорошо, при условии, что я использую одни и те же идентификаторы каждый раз. Однако, когда я пытаюсь сделать то же самое в событии PreRender, оно завершается неудачей.
В любом случае, вот мой пример кода:
namespace 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] закомментирована. Здесь все работает просто отлично. Когда я помещаю этот элемент управления на страницу и загружаю страницу, я вижу ссылку с надписью «Клик». Когда я нажимаю на ссылку, на странице выводится текст «[новое значение]», а на следующей строке мы видим знакомую ссылку «Клик». Каждый раз, когда я нажимаю на ссылку «Клик», мы видим одно и то же. Пока все хорошо.
Но теперь давайте рассмотрим случай 2, где строка рядом с [CASE 1] закомментирована, а строка рядом с [CASE 2] не закомментирована. Здесь мы сталкиваемся с проблемами. Когда мы загружаем страницу, мы видим ссылку «Клик». Однако, когда я нажимаю на ссылку, страница выводит текст «[]» вместо «[новое значение]». Событие клика срабатывает нормально. Однако текст «нового значения», который я назначил атрибуту Value элемента управления, не сохраняется. Еще раз, это немного загадка для меня. Почему, когда я воссоздаю элемент управления в OnLoad, все в порядке, но когда я воссоздаю элемент управления в PreRender, значение не сохраняется?
Я чувствую, что просто должен быть способ сделать это. Когда я воссоздаю элемент управления в PreRender, есть ли способ привязать вновь созданный элемент управления к ViewState?
Я боролся с этим уже несколько дней. Будем благодарны за любую помощь, которую вы можете оказать.
Спасибо.