Массив кнопок исчезает после нажатия кнопки

Почему мои кнопки (массив кнопок) исчезают после нажатия на любую из них? Вот структура кода. Заранее большое спасибо.

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);
    }
}
Другие вопросы по тегам