我有一些使用参数动态创建的UserControl:
foreach (DataRow dr in drc)
{
question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
List<Object> listParams = new List<Object>();
listParams.Add(question);
AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
pnl_question_list.Controls.Add(qa);
}
这是我在SoF上发现的一种方法,效果很好。 单击按钮时调用此方法,并正确创建所有用户控件。 在这个用户控件中,我有一个按钮:
<asp:Button ID="btn_validation_modify_question" runat="server" Text="Modifier"
CssClass="clear_left_float_left myBouton myBoutonEnvoyer"
OnClick="btn_validation_modify_question_Click"/>
我的方法:
protected void btn_validation_modify_question_Click(object sender, EventArgs e)
{
QUESTION q = (from m in bdd.QUESTION where m.ID_QUESTION == question.ID_QUESTION select m).FirstOrDefault();
q.MESSAGE = txt_modify_question_message.InnerText;
q.ID_THEME = new Guid(ddl_modify_question_theme.SelectedValue);
bdd.ApplyCurrentValues<QUESTION>("QUESTION", q);
bdd.SaveChanges();
}
但是当我点击按钮时,它不会应用该方法,并重新加载页面,就像我没有任何声明的方法一样。
有什么我不知道的吗?我已经使用过这种技术,一切正常......
答案 0 :(得分:3)
如果您动态添加控件,通常需要在Init
或PreInit
页面事件中执行此操作。否则事件处理程序永远不会工作。
因此,必须在每次访问页面时以编程方式将动态添加的控件添加到Web页面。添加这些控件的最佳时间是在页面生命周期的初始化阶段,该阶段发生在加载视图状态阶段之前。也就是说,我们希望在加载视图状态阶段到达之前完成控制层次结构。因此,最好在代码隐藏类中为Page类的Init事件创建一个事件处理程序,并在那里添加动态控件。
注意您可以通过加载控件来逃脱 的Page_Load 事件处理程序并正确维护视图状态。这一切都取决于你是否以编程方式设置动态加载控件的任何属性,如果是,那么当你相对于 Controls.Add被(dynamicControl) 线。对此的深入讨论有点超出了本文的范围,但它可能起作用的原因是因为 控制 酒店的 加() 即使加载视图状态阶段已经过去,方法也会递归地将父视图状态加载到其子视图中。
Here您有更多信息。
修改强>
为了确保我们正在谈论相同的问题,您可以在这里查看代码的样子
protected void Page_Init(object sender, EventArgs e)
{
...
foreach (DataRow dr in drc)
{
question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
List<Object> listParams = new List<Object>();
listParams.Add(question);
AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
pnl_question_list.Controls.Add(qa);
}
...
}
答案 1 :(得分:0)
PageLoad(){
If(!Page.IsPostBack())
foreach (DataRow dr in drc)
{
question = (from ques in bdd.QUESTION where ques.ID_QUESTION == idQuestion select ques).FirstOrDefault();
List<Object> listParams = new List<Object>();
listParams.Add(question);
AdminQuestion qa = (AdminQuestion)(Controller.LoadControl(Page, "~/UserControls/AdminQuestion.ascx", listParams.ToArray()));
pnl_question_list.Controls.Add(qa);
}
}
您尝试使用此解决方案吗?而不是使用Page_Init()?