Я согласен с другими замечаниями, сделанными здесь: «Если вы можете отказаться от создания элементов управления динамически, тогда сделайте это ...» (@ Jesper Blad Jenson aka ), но вот уловка, с которой я работал с динамически созданными элементами управления в прошлом.
Проблема становится курицей и яйцом. Вам нужен ViewState для создания дерева элементов управления, и вам нужно, чтобы дерево элементов управления было создано для доступа к ViewState. Ну, это почти правильно. Есть способ получить значения ViewState непосредственно перед тем, как заполнится остальной частью дерева. Это путем переопределения LoadViewState(...)
и SaveViewState(...)
.
В SaveViewState сохраните элемент управления, который вы хотите создать:
protected override object SaveViewState()
{
object[] myState = new object[2];
myState[0] = base.SaveViewState();
myState[1] = controlPickerDropDown.SelectedValue;
return myState
}
Когда платформа вызывает ваше переопределение «LoadViewState», вы получите точный объект, который вы вернули из «SaveViewState»:
protected override void LoadViewState(object savedState)
{
object[] myState = (object[])savedState;
// Here is the trick, use the value you saved here to create your control tree.
CreateControlBasedOnDropDownValue(myState[1]);
// Call the base method to ensure everything works correctly.
base.LoadViewState(myState[0]);
}
Я успешно использовал это для создания страниц ASP.Net, где DataSet был сериализован в ViewState для хранения изменений во всей сетке данных, что позволяет пользователю вносить несколько изменений в PostBacks и, наконец, фиксировать все свои изменения в одном Операция «Сохранить».