Вы правы, страница перестроена, поэтому вы должны воссоздать дерево управления с каждой частичной или полной обратной передачей.
Чтобы выполнить это, вы должны сделать свою страницу состоятельной или включить достаточную информацию, чтобы воссоздать дерево управления с каждым обратным переходом. Каждый подход имеет свои преимущества/недостатки.
Stateful
Скорее всего Stateful страница будет использовать Session; необходимо принять меры, чтобы не сбрасывать слишком много данных в сеанс и правильно очищать (я обычно использую диспетчер для переноса сеанса и управления количеством активных объектов, которые пользователь может иметь сразу). Поверхность заключается в том, что сеанс (даже вне процесса) очень быстрый и безопасный.
Roundtrip
Этот подход использует ViewState, скрытые поля или информацию в URL. Если информация включена в страницу, она должна быть измерена в байт, то есть она должна быть крайне мала. Он также невосприимчив к подделке.
Положительный момент заключается в том, что вам действительно не нужно много делать, чтобы выполнить эту работу, и нет процесса удаления, необходимого для очистки.
Database
В качестве альтернативы, вы можете сохраняться изменения в базу данных, с каждым щелчком мыши и восстановить дерево из базы данных, но я не обычно не поклонник этого подхода, если щелчок не представляет собой очень Значительное событие и данные завершены и подтверждены.
очень простой пример
Ниже приведен пример, показывающий использование сессии для поддержания дерева управления. Это должно работать, но в нем не учитываются многие вещи, такие как пользователь, открывающий другую копию одной и той же страницы в том же сеансе. Управление деревьями управления может стать довольно сложным.
private List<string> _listOfStrings
{
get
{
return (List<string>)Session["_listOfStrings"];
}
set
{
Session["values"] = value;
}
}
protected override OnInit(EventArgs e)
{
if(!Page.IsPostback)
{
_listOfStrings = new List<string>();
}
BuildControlTree();
}
private void BuildControlTree()
{
foreach(string s in _listOfStrings)
{
// add a control to the control tree
}
}
protected void btnAddItem_Click(object sender, EventArgs e)
{
_listOfStrings.Add("some new item");
// insert the control into the tree
}
Можете ли вы привести пример того, как я могу это сделать? – jax
@jax - Я обновил свой ответ несколькими вариантами и образцом. Управление деревьями в веб-формах сопряжено с трудностями; Я написал целую библиотеку, чтобы абстрагировать процесс и не забывать писать «сантехнический» код снова и снова, чтобы управлять им. –