自定义Web用户控件's事件的服务器控件在动态添加到页面时不会触发
本文关键字:添加 动态 服务器控件 控件 用户 Web 事件 自定义 | 更新日期: 2023-09-27 18:10:41
我在尝试在ASPX页面上动态添加web用户控件时遇到了一个小问题,我已经阅读了页面生命周期,并看到了一些在页面生命周期中尽可能早地添加动态控件的建议。到目前为止,控件是在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);
}
然后onInit我有以下内容:
protected override void OnInit(EventArgs e)
{
foreach (ucQuestion q in lstQuestions)
{
divQuestions.Controls.Add(q);
}
base.OnInit(e);
}
ucQuestion用户控件有几个标签,一些文本框和一个FileUpload按钮来保存发布的文件,当我按下按钮时,页面被发布回来,但我的代码中的断点永远不会被击中,简而言之,我需要知道是否有什么我做错了,而添加控件不绑定控件到他们适当的事件。如果我静态地添加用户控件,事件就可以正常工作,只是用户可以向考试中添加他认为合适的问题,所以我必须动态地添加它们。
您需要在页面生命周期的早期添加控件,例如OnInit
。此外,确保每次将页面发回时都为控件分配相同的ID。
另一个选择是使用DynamicControlsPlaceHolder
,它将自动管理动态控件的持久性,而不需要任何额外的代码: