【问题标题】:UserControl's Event Handler not firingUserControl 的事件处理程序未触发
【发布时间】:2013-12-11 21:49:42
【问题描述】:

我将 UserControl 动态加载到 MultiView 控件中的 View 中。尽管 UserControl 添加了一个事件处理程序,但该事件永远不会触发。

我在这里缺少什么? 谢谢!

包含 ASPX 页面:

protected override void OnPreRender(EventArgs e)
{
    if (MultiView1.ActiveViewIndex == 2) //If the tab is selected, load control
    {
        Control Presenter = LoadControl("Presenter.ascx");
        (MultiView1.ActiveViewIndex.Views[2].Controls.Add(Presenter);
    }
    base.OnPreRender(e);
}

Presenter.ascx.cs

override protected void OnInit(EventArgs e)
{
    Retry.Click += this.Retry_Click; //This is a .Net 2.0 project
    base.OnInit(e);
}


protected void Retry_Click(object sender, EventArgs e)
{
    //This never fires
}

【问题讨论】:

    标签: c# events user-controls multiview


    【解决方案1】:

    我认为它没有触发,因为您正在页面的预呈现事件中加载控件。在回发时,控件将丢失,因为它没有视图状态。因此,无法控制触发其事件。尝试在页面的 init 事件中加载控件。让我们知道会发生什么!

    【讨论】:

    • 就是这样。谢谢!我也必须删除 If 语句,因为在 OnPreInit 中,未设置 MultiView1.ActiveViewIndex。
    【解决方案2】:

    回发事件处理在渲染之前完成,因此在您的情况下,该控件不存在于页面中。

    生命周期事件按此顺序触发(略过一些):

    1. 初始化
    2. 加载
    3. 预渲染
    4. 卸载

    并且事件处理是在 Load 和 PreRender 之间完成的(以防某些事件改变了页面的呈现方式,这是有道理的)。

    因此,只需将加载 Retry 控件的代码移至 Load 或 Init。

    参考:Asp.Net Page Life Cycle Overview

    【讨论】:

      【解决方案3】:

      控件最初必须是可见的才能进入 OnPreRender 事件。 但也许你希望它不可见。 一定要有 EnableViewState = false;

      【讨论】:

        【解决方案4】:

        听起来每次回帖后都没有添加控件,我会在包含的 aspx 页面中取出 if 语句,看看是否能解决问题...我假设 Retry 是一个按钮?

        【讨论】:

        • 我已经尝试删除 If 语句——没有区别。是的,重试是一个按钮。
        猜你喜欢
        • 1970-01-01
        • 2012-04-15
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多