39

是否有在所有 Page_Load事件完成后触发的事件?

我怎样才能拥有多个Page_Load
当您拥有用户控件时。

在我的页面可以呈现之前,我需要我的页面(和所有嵌入式控件)通过完成他们的Page_Load事件来初始化自己。

当然,问题在于,如果我将代码放入页面的Page_Load处理程序中:

MyPage.aspx
   --> Page_Load
          ---> DoSomethingWithUserControl()
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored

UserControl1然后我开始在它准备好之前访问我的控件。

我需要一种所有Page_Load事件触发后、但任何回发事件(例如 Click 事件)触发之前运行代码的方法:

MyPage.aspx
   --> Page_Load
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
   --> Page_AfterLoad
          ---> DoSomethingWithUserControl()

查看 MSDN 中的页面生命周期,在所有 Page_Loads 完成似乎无法引发事件:

在此处输入图像描述

在所有 Page_Loads 完成之后,有没有办法提高?

4

2 回答 2

65

Page_LoadComplete是加载所有控件后引发的事件

请记住,该Init事件首先由所有子控件触发,并且当所有控件都已初始化时,才Init引发页面事件。事件Load反过来工作,页面首先引发Load事件,然后每个子控件引发自己的Load事件。最后LoadComplete提出。请注意,仅当控件是在设计时创建时才是正确的,当控件是动态创建时,它们(遗憾地)没有严格遵循这种方法。

来自 MSDN:

如果控件是在运行时动态创建或在数据绑定控件的模板中以声明方式创建的,则它们的事件最初不会与页面上其他控件的事件同步。例如,对于在运行时添加的控件,Init 和 Load 事件在页面生命周期中发生的时间可能比以声明方式创建的控件的相同事件要晚得多。因此,从它们被实例化的那一刻起,动态添加的控件和模板中的控件一个接一个地引发它们的事件,直到它们赶上它被添加到 Controls 集合中的事件。

看一看:

(来源:http: //msdn.microsoft.com/en-us/library/ms178472.aspx

在此处输入图像描述

编辑 1

为了满足您的所有要求:

我需要一种在所有 Page_Load 事件触发后、但在任何回发事件(例如 Click 事件)触发之前运行代码的方法:

我认为最简单的方法是在用户控件中声明一个自定义事件并在加载控件后触发它,然后在您的 ASPX 中订阅该事件

用户控制

    public event Action LoadCompleted = delegate { };

    protected void Page_Load(object sender, EventArgs e)
    {
        this.LoadCompleted();
    }

ASPX 页面

    protected void Page_Load(object sender, EventArgs e)
    {
        this.myUserControl.LoadCompleted += () => 
        {
            // do somethign interesting
            this.lblMessage.Text = DateTime.Now.ToString();
        };
    }
于 2012-06-27T21:28:32.113 回答
1

似乎真的没有办法可靠地让您的代码在所有(静态声明的,请参阅 Jupaols 对动态添加的评论)控件加载的时间和它们的回发事件引发的时间之间执行。

我什至使用反射器来反汇编 Page 类,据我所知,页面没有调用任何你可以在这些时间之间使用的方法。

因此,对于一般情况,您似乎不走运。

但你的说法

然后我在准备好之前开始访问我的 UserControl1 控件

是有问题的。到Page_Load调用该方法时,所有控件(至少是静态声明的控件)上都已设置了视图状态和控件状态。因此,除非您在控件的 OnLoad 方法中进行更多的状态初始化,否则该控件已准备好进行修改。如果您确实在 OnLoad 中发生了一些事情,那么为什么不在那里进行修补呢?

于 2012-06-28T10:21:32.787 回答