Серверные элементы управления событиями пользовательского веб-пользовательского элемента управления не запускаются при динамическом добавлении на страницу

#c# #asp.net

#c# #asp.net

Вопрос:

У меня возникла небольшая проблема при попытке динамического добавления элемента управления веб-пользователя на страницу ASPX, я прочитал о жизненном цикле страницы и увидел несколько предложений по добавлению динамических элементов управления как можно раньше в жизненный цикл страницы. На данный момент элементы управления создаются для события PreInit, как следующий блок кода:

     protected override void OnPreInit(EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            lstQuestions = new List<ucQuestion>();
            Session["listQuestionss"] = lstQuestions;
            ucQuestion q = null;
            for (int i = 0; i < MIN_QUESTIONS; i  )
            {
                q = LoadControl("~/UserControls/Exam/ucQuestion.ascx") as ucQuestion;
                q.ID = String.Format("Question{0}", listQuestions.Count   1);
                listQuestions.Add(q);
            }
        }
        else
        {
            if (Session["listQuestions"] != null)
            {
                listQuestions = Session["listQuestions"] as List<lstQuestions>;
            }
            else
            {
                Response.Redirect("~/Views/HR/Exams/AddExam.aspx");
            }
        }
        base.OnPreInit(e);
    }
  

И затем при запуске у меня есть следующее:

     protected override void OnInit(EventArgs e)
    {
        foreach (ucQuestion q in lstQuestions)
        {
            divQuestions.Controls.Add(q);
        }
        base.OnInit(e);
    }
  

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

Ответ №1:

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

Другой вариант — использовать DynamicControlsPlaceHolder , который будет автоматически управлять сохранением динамических элементов управления, не требуя никакого дополнительного кода:

http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

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

1. Спасибо, элементы управления добавляются на ранних этапах жизненного цикла страницы, я попытался добавить их в init, и они ведут себя так же, как и сейчас, когда они генерируются методом Load в PreInit (даже раньше, чем раньше). События по-прежнему не запускаются.