Динамически добавленные кнопки не запускают событие клика 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
вернуться к истине только для элементов управления, которые мне нужны.