Вы правы, страница перестраивается, поэтому вы должны воссоздавать дерево управления при каждой частичной или полной обратной передаче.
Для этого вы должны сделать вашу страницу состоящей из состояний или включить достаточно информации для воссоздания дерева управления при каждом обращении туда и обратно. Каждый подход имеет свои преимущества / недостатки.
Stateful
Скорее всего, страница с состоянием будет использовать Session; необходимо позаботиться о том, чтобы не выгружать слишком много данных в сессию и правильно очищать (обычно я использую менеджер, чтобы обернуть сессию и управлять количеством активных объектов, которые пользователь может иметь одновременно). Плюс в том, что сессия (даже вне процесса) очень быстрая и безопасная.
Roundtrip
Этот подход использует ViewState, скрытые поля или информацию в URL. Если информация включена в страницу, она должна быть измерена в байтах , то есть она должна быть очень маленькой. Он также не защищен от вмешательства.
Плюс в том, что вам действительно не нужно много делать, чтобы выполнить эту работу, и для очистки не требуется никакого процесса утилизации.
База данных
В качестве альтернативы, вы можете сохранять свои изменения в базе данных с каждым щелчком мыши и перестраивать дерево из базы данных, но я обычно не сторонник этого подхода, если только щелчок не представляет очень важное событие, а данные полны и ПРОВЕРЯЕМЫЕ.
Очень простой пример
Вот пример, показывающий использование Session для поддержки дерева управления. Это должно работать, но это не учитывает многие вещи, например, пользователь открывает другую копию той же страницы в том же сеансе. Управление деревьями управления может быть довольно сложным.
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
}