UserControl的事件处理程序没有触发

时间:2009-04-27 14:01:55

标签: c# events user-controls multiview

我将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
}

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

生命周期事件按此顺序触发(跳过几个):

  1. 初始化
  2. 加载
  3. 的PreRender
  4. 卸载
  5. 事件处理在Load和PreRender之间完成(如果某些事件改变了呈现页面的方式,这是有意义的。)

    所以只需将加载Retry控件的代码移动到Load或Init。

    参考:Asp.Net Page Life Cycle Overview

答案 2 :(得分:2)

控件必须最初可见,才能输入OnPreRender事件。 但也许你想让它变得不可见。 一定要 EnableViewState = false;

答案 3 :(得分:1)

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