在UserControl中未检测到单击事件

时间:2012-05-21 14:03:49

标签: asp.net user-controls click

我有一些使用参数动态创建的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();
}

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

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

2 个答案:

答案 0 :(得分:3)

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

  
    

因此,必须在每次访问页面时以编程方式将动态添加的控件添加到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()?