0

我有一些动态创建的用户控件,带有参数:

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();
}

但是当我单击按钮时,它不会应用该方法,而是重新加载页面,就像我没有任何声明的方法一样。

有什么我不知道的吗?我已经使用过这种技术并且一切正常......

4

2 回答 2

3

如果您动态添加控件,您通常需要在页面事件InitPreInit页面事件上执行此操作。否则事件处理程序将永远无法工作。

因此,必须在每次页面访问时以编程方式将动态添加的控件添加到网页中。添加这些控件的最佳时间是在页面生命周期的初始化阶段,它发生在加载视图状态阶段之前。也就是说,我们希望在加载视图状态阶段到达之前完成控制层次结构。出于这个原因,最好在您的代码隐藏类中为 Page 类的 Init 事件创建一个事件处理程序,并在那里添加您的动态控件。

注意 您可能能够摆脱在 Page_Load 事件处理程序中加载控件并正确维护视图状态的情况。这完全取决于您是否以编程方式设置动态加载的控件的任何属性,如果是,那么当您相对于 Controls.Add(dynamicControl) 行进行设置时。对此的深入讨论有点超出本文的范围,但它可能起作用的原因是因为 Controls 属性的 Add() 方法递归地将父视图状态加载到其子视图中,即使加载视图状态阶段已经过去。

在这里,您可以获得更多信息。

编辑

只是为了确保我们谈论的是相同的,这里你有你的代码应该是什么样子

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);

    }
    ...
}
于 2012-05-21T14:07:47.257 回答
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);
        }
}

Did you try with this solution? And not use Page_Init()?

于 2013-01-26T03:32:53.243 回答