Метод обработчика событий b_Command не выполняется, потому что кнопки возврата назад не воссоздаются (так как они генерируются динамически). Вам нужно пересоздавать их каждый раз, когда ваша страница обновляется, но для этого вам нужно явно кэшировать информацию где-то в состоянии.
Если эту операцию с областью страницы проще всего сохранить в ViewState (в виде строк - если вы начнете загружать ViewState с объектами, вы увидите, что производительность снизится), чтобы вы могли проверить ее при следующей загрузке (или любое другое предыдущее событие) и заново создайте кнопки при перезагрузке страницы.
Если операция ограничена сессией, вы можете легко сохранить объект (массив или что-либо еще) в сеансе и извлечь его при следующей загрузке (или инициализации), чтобы воссоздать ваши элементы управления.
Этот сценарий означает, что вам нужно просто сохранить некоторую информацию о вашей кнопке в вашем b_Command EventHandler вместо того, чтобы создавать и добавлять кнопки, поскольку в этом случае вы потеряете относительную информацию при следующей обратной передаче (как это происходит сейчас).
чтобы ваш код стал чем-то вроде:
namespace CloudNavigation
{
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
this.recreateButtons();
}
else
{
// Execute heavy search 1 to generate buttons
Button b = new Button();
b.Text = "Selection 1";
b.Command += new CommandEventHandler(b_Command);
Panel1.Controls.Add(b);
//store this stuff in ViewState for the very first time
}
}
void b_Command(object sender, CommandEventArgs e)
{
//Execute heavy search 2 to generate new buttons
//TODO: store data into ViewState or Session
//and maybe create some new buttons
}
void recreateButtons()
{
//retrieve data from ViewState or Session and create all the buttons
//wiring them up to eventHandler
}
}
}
Если вы не хотите вызывать restoreateButtons при загрузке страницы, вы можете сделать это в PreLoad или в событиях Init, я не вижу разницы, так как вы сможете получить доступ к переменным ViewState / Session везде (в представлении Init по состоянию не применяется, но вы можете получить к нему доступ для повторного создания динамических кнопок).
Кто-то возненавидит это решение, но, насколько мне известно, единственный способ сохранить данные состояния на стороне сервера - это ViewState - Сеанс - Page.Transfer или файлы cookie на стороне клиента.