Вопрос по asp.net, c#, visual-studio-2008 – Массив кнопок исчезает после нажатия кнопки

1

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

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   ответа
5

Если вы посмотрите на мой ответ на ваш последний вопрос, вы найдете пример решения этой проблемы:

https://stackoverflow.com/a/11061782/1268570

Основная проблема заключается в понимании жизненного цикла страницы 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 событие)

В качестве краткого справочного руководства взгляните на жизненный цикл страницы:

enter image description here

2

Вы должны воссоздавать динамически созданные элементы управления не позднее каждой обратной передачи в 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);
    }
}
@AnnaT: я отредактировал свой ответ, чтобы показать, как добавить обработчик событий. Я также упустил из виду, что он отсутствует в первую очередь.
Большое спасибо обоим. Я добавляю кнопки на панель, думаю, я слишком упростил код, пытаясь сделать его читаемым и не скучным. Тем не мение,the buttonHandler method responsible for changing the color of the last clicked button doesn't work as intended, Любой совет по этому поводу? Anna T
Похоже, мы заметили одни и те же вещи в другом порядке :)

Похожие вопросы