Массив кнопок исчезает после нажатия кнопки
Почему мои кнопки (массив кнопок) исчезают после нажатия на любую из них? Вот структура кода. Заранее большое спасибо.
public partial class Seatalloc2 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopulateControls();
}
}
protected void PopulateControls()
{
Button[,] buttonArray = new Button[10, 14];
for (int a = 0; a < 10; a++)
for (int b = 0; b < 14; b++)
{
buttonArray[a, b] = new Button();
Panel2.Controls.Add(buttonArray[a, b]);
}
}
public void buttonHandler(object sender, EventArgs e)
{
Button btn = sender as Button;
btn.BackColor = Color.Red;
}
}
2 ответа
Если вы посмотрите на мой ответ на ваш последний вопрос, вы найдете пример решения этой проблемы:
/questions/42968214/sobyitiya-klikov-na-massive-knopok/42968225#42968225
Основная проблема заключается в понимании жизненного цикла страницы ASP.Net (я его ненавижу), но полезно и важно понять основы, стоящие за ней.
Эта документация от Microsoft подробно объясняет жизненный цикл страницы
http://msdn.microsoft.com/en-us/library/ms178472.aspx
В основном элементы управления исчезают, потому что вам нужно заново создавать их на странице с каждым постбэком, а в коде вы создаете их только при первой загрузке страницы
Рекомендуемое событие для создания динамических элементов управления - это PreInit
если у вас нет главной страницы или Init
если у вас есть одна главная страница
Так что если вы измените свой код на:
void Page_Init(object sender, EventArgs e)
{
PopulateControls();
}
Ваши кнопки сохранят свое состояние. Не беспокойтесь о состоянии, даже когда они воссоздаются в каждом посте, так как вы делаете это в Init
ASP.Net загрузит ViewState
автоматически к вашим элементам управления (это возможно, потому что ASP.Net загружает состояние просмотра после Init
событие и до Load
событие)
В качестве краткого справочного руководства взгляните на жизненный цикл страницы:
Вы должны воссоздавать динамически созданные элементы управления не позднее каждой обратной передачи в Page_Load с тем же идентификатором, что и раньше, чтобы гарантировать, что ViewState
загружен правильно, и события запускаются. В вашем случае со статическим количеством элементов управления достаточно позвонить PopulateControls
даже на постбэках:
protected void Page_Load(object sender, EventArgs e)
{
PopulateControls();
}
Но вам также нужно добавить Buttons
к Page
контрольная коллекция, например для Panel
, Ваш массив кнопок не имеет смысла:
protected void PopulateControls()
{
for (int a = 0; a < 10; a++)
for (int b = 0; b < 14; b++)
{
var btn = new Button();
btn.ID = "Btn_" + a + "_" + b;
// add an event handler for the click-event
btn.Click += buttonHandler;
MyButtonPanel.Controls.Add(btn);
}
}