Динамически добавленные кнопки не запускают событие клика C#

У меня есть несколько кнопок, которые динамически добавляются на страницу asp.net. Однако событие onclick не запускается. Вот код для его добавления, и он запускается при загрузке страницы. Я очень новичок в ASP.NET, поэтому я уверен, что я делаю некоторые основные ошибки. ТИА.

    protected void Page_Load(object sender, EventArgs e)
    {
        FillTable();
        string rownum = (goalstable.Rows.Count).ToString();
        Button bt = new Button();
        bt.Text = "View";
        bt.ID = (rownum);
        bt.CssClass = "button";
        bt.Click += Viewbutton_Click;
        goalstable.Rows[1].Cells[0].Controls.Add(bt);
    }

FillTable () - это метод, который заполняет таблицу из базы данных SQL. Событие при нажатии на кнопку, которая была добавлена.

     protected void Viewbutton_Click(object sender, EventArgs e)
    {
        getGID();
        setGoalDets();
        goals.Style.Add("display", "block");
        darkLayer2.Style.Add("display", "block"); 
    }

Любые идеи, что я могу делать неправильно.

1 ответ

Решение

В двух словах, вам нужно добавить кнопку ранее в жизненном цикле страницы, до события Page_Load.

Происходит то, что каждый http-запрос к вашей странице приводит к совершенно новому объекту страницы. Каждое событие требует нового http-запроса. Поэтому вы начинаете с совершенно нового объекта Page и совершенно новой ViewButton, когда вызывается событие click для вашей ViewButton. Чтобы все работало правильно, чтобы новая страница имела те же свойства, что и старая, ASP.Net использует функцию ViewState. Информация ViewState (как правило) передается вместе с запросом http из браузера клиента и используется для создания нового объекта Page с теми же значениями элементов управления и свойств, что и у старого.

Вот хитрость: ViewState восстанавливается для страницы до обработки события загрузки. Если кнопка еще не существует во время восстановления ViewState, эта информация выбрасывается, и страница не будет знать позже, что она должна вызвать событие нажатия (или, скорее, она будет думать, что там нет кнопки для нажатия). код события для запуска в первую очередь).

Поэтому вам нужно переместить код, чтобы создать кнопку на Pre_Init событие, которое запускается до восстановления ViewState.

При работе с "динамическими" элементами управления в ASP.Net WebForms мне часто бывает проще просто добавить разумное количество элементов управления на страницу в статической манере и установить их все так, чтобы их Visible свойство ложно. Тогда во время выполнения я установлю Visible вернуться к истине только для элементов управления, которые мне нужны.

Другие вопросы по тегам