C # ASP - динамическое создание кнопок и назначение обработчиков событий - PullRequest
0 голосов
/ 04 мая 2018

У меня есть несколько выпадающих списков, и в зависимости от выбора пользователя я должен показать результаты, полученные из SQL, в отдельных кнопках [созданных динамически]. У меня есть событие нажатия кнопки, которое запускает динамическое создание кнопки.

КОД:

void CreateButtons(string val)
{
        Button btn = new Button();
        btn.Text = val;
        Panel1.Visible = true;
        btn.ID = val.Replace(" ", "_");
        btn.Click += new System.EventHandler(test);
        Panel1.Controls.Add(btn);
}


protected void Button1_Click(object sender, EventArgs e)
{
        int cont = 0;
        string[] names = new string[40];
        string del2 = "MY SQL STATEMENT"
        SqlCommand del1cmd2 = new SqlCommand(del2, conn);
        SqlDataAdapter da = new SqlDataAdapter(del1cmd2);
        DataTable dt = new DataTable();
        da.Fill(dt);
        foreach (DataRow row in dt.Rows)
        {
            names[cont] = row.Field<string>(0);
            CreateButtons(names[cont]);
        }
        Response.Write(names[cont]);
}

ВОПРОС:

Я получаю результаты из SQL, сохраняю их в адаптере данных и зацикливаю функцию CreateButtons для создания отдельных кнопок для каждой возвращаемой строки. Я могу получить желаемый результат для создания кнопок, но проблема возникает, когда я пытаюсь установить действие для кнопок.

Мне нужно установить обработчик событий onclick для всех динамически создаваемых кнопок, чтобы я мог выполнять отдельные действия для них.

Когда я нажимаю на текущий код с оператором new System.EventHandler, страница обновляется, и ничего не происходит, даже если у меня есть модуль ниже.

public void test(object sender, EventArgs e)
{
     Response.Write("Dynamic Button click event");
}

ИССЛЕДОВАТЕЛЬСКИЕ УСИЛИЯ: Я долго искал решения и смог найти рабочий код с созданием кнопки при загрузке страницы, но не нашел аналогичного случая с динамическим созданием кнопки при событии нажатия кнопки.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вот что происходит.

  1. Кто-то нажимает кнопку1. Это вызывает PostBack
  2. ASP.Net получает запрос POST, создает новый экземпляр (это ключ) вашего класса Page и начинает перезапускать весь жизненный цикл страницы.
  3. Код Button1_Click() выполняется как часть жизненного цикла страницы и помещает новые кнопки в класс страницы
  4. Класс Page отображает HTML-код в Response, где браузер получает его и отображает на экране для ваших пользователей. На данный момент экземпляр класса Page, с которым вы работали на сервере & mdash; один со всеми новыми кнопками & mdash; уничтожено . Однако кнопки были отображены в браузере.
  5. Пользователь нажимает на одну из ваших новых кнопок. Это вызывает новый PostBack.
  6. ASP.Net получает запрос POST и создает новый экземпляр класса Page.

Здесь все становится грязно. Этот новый экземпляр класса Page не имеет динамических кнопок.

Вам нужен код для повторного добавления этих кнопок в класс для каждого PostBack. Кроме того, обработчики событий для жизни страницы ASP.Net определяются за до события Page_Load. Поэтому, если вы подождете, пока Page_Load настроит динамические кнопки, все будет работать неправильно. Вы увидите их на экране. Вы можете щелкнуть по ним и вызвать PostBack (потому что обработчик событий будет там для шага Render позже). Но ничего не произойдет, тогда вы нажмете кнопку.

Чтобы исправить это, кнопки должны быть (заново) созданы в Page_Init или Page_PreInit.

0 голосов
/ 04 мая 2018

Динамические элементы управления необходимо заново создать в Page_Init.

Попробуйте пример ниже для тестирования

protected void Page_Init(object sender, EventArgs e)
{
  CreateButtons("1");
  CreateButtons("2");
}
...