6

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

演示者.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

4 回答 4

8

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

于 2009-04-27T14:17:47.917 回答
6

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

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

  1. 在里面
  2. 加载
  3. 预渲染
  4. 卸下

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

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

参考:Asp.Net 页面生命周期概述

于 2009-04-27T14:31:56.400 回答
2

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

于 2013-12-11T13:49:42.227 回答
1

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

于 2009-04-27T14:17:06.827 回答