asp.net динамическая кнопка с обработчиком событий

#c# #asp.net #button #dynamic #event-handling

#c# #asp.net #кнопка #динамический #обработка событий

Вопрос:

У меня здесь небольшая проблема с динамически генерируемыми кнопками и их обработчиком событий в asp.net . Я создаю гибкую таблицу с дополнительными кнопками для специальных пользователей. Кнопки будут генерироваться динамически, что работает нормально. Но я не могу заставить обработчик событий работать.

Вот несколько фрагментов из моего кода: Создайте кнопку (в собственной функции).

 …
Button ButtonChange = new Button();

ButtonChange.Text = "Change";
ButtonChange.ID = "change_"   i.ToString();
ButtonChange.Font.Size = FontUnit.Point(7);
ButtonChange.ControlStyle.CssClass = "button";
ButtonChange.Click  = new EventHandler(test);
…
  

И

 void test(object sender, EventArgs e)
{ 
   // Do some stuff       
}
  

Мой Page_Load пуст.

Но программа не перейдет к тестированию, если я нажму кнопку. Что происходит не так?

Редактировать!!! Проблема в том, что я не знаю с самого начала, сколько строк я получу из своего SQL-запроса обратно. Для каждой строки я добавлю кнопку удаления и изменения. Я вызываю в своей программе метод, который строит результат в виде таблицы. В этом методе я проверяю, является ли текущий пользователь AdminUser, и если он есть, я вызову функцию buildAdminButtons . Здесь я создаю кнопки в новом столбце для каждой строки. Как я мог бы загрузить это в OnLoad?

 private void buildAdminButtons(TableRow tempRow, int i)
{
    Button ButtonDelete = new Button();
    Button ButtonChange = new Button();

    TableCell change = new TableCell();
    TableCell delete = new TableCell();

    ButtonChange.Text = "Change";
    ButtonChange.ID = "change_"   i.ToString();
    ButtonChange.Font.Size = FontUnit.Point(7);
    ButtonChange.ControlStyle.CssClass = "button";


    ButtonDelete.Text = "Delete";
    ButtonDelete.ID = "delete_"   i.ToString();
    ButtonDelete.Font.Size = FontUnit.Point(7);
    ButtonDelete.ControlStyle.CssClass = "button";

    change.Controls.Add(ButtonChange);
    delete.Controls.Add(ButtonDelete);

    tempRow.Cells.Add(change);
    tempRow.Cells.Add(delete);
}
  

Я добавляю к каждой кнопке уникальный идентификатор, который я не знаю с самого начала. Как я мог с этим справиться?

Ответ №1:

Вы должны поместить этот код в page_load page_init событие или.

 protected void Page_Load()
{
  Button ButtonChange = new Button();

  ButtonChange.Text = "Change";
  ButtonChange.ID = "change_"   i.ToString();
  ButtonChange.Font.Size = FontUnit.Point(7);
  ButtonChange.ControlStyle.CssClass = "button";
  ButtonChange.Click  = new EventHandler(test);
}
  

Прочитайте статью MSDN — Как: Добавить элементы управления в ASP.NET Веб-страница программно?

Комментарии:

1. в качестве дополнительного примечания, это динамическое подключение события должно происходить при каждой обратной передаче, но, как сказал AVD, либо в page_load, либо в page_init (иначе до того, как событие срабатывает в жизненном цикле страницы.

2. Достаточно ли инициализировать кнопку в Page_Load? … Я добавляю кнопку в каждую строку таблицы, гораздо проще сгенерировать их кнопки. Спасибо.

3. в статье msdn нет упоминания о динамических элементах управления, у которых есть события. И нет предложения о событиях Page_Load или Page_Init.