4

我想在我的用户控件生命周期的“预加载”阶段执行一些代码。但是 preload 事件仅在 Page 对象上可用。所以,我在我的用户控件中添加了以下方法:

Private Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Page.PreLoad 

但是,我知道会出现编译错误:“Handles 子句需要在包含类型或其基类型之一中定义的 WithEvents 变量”

由于 Page 属性是从 UserControl 继承的,我看不出这是如何轻松完成的。

任何帮助都感激不尽!

4

3 回答 3

5

我很抱歉给出了一个 C# 示例,但我不记得如何在 VB 中做到这一点......

无论如何,在您的 UserControl 的 Init 中,您可以显式地将 Page_PreLoad 方法指定为 UserControl 的 Page 属性的 PreLoad 事件的处理程序,而不是在方法声明中使用“Handles”语法。您的示例正在尝试将事件处理程序分配给 UserControl 对象上的事件,以处理 UserControl 对象未引发的事件。正如您所指出的,UserControl 不继承自 Page,这是 PreLoad 事件所在的位置。然而,UserControl 确实包含一个 Page 对象作为其属性之一,这反过来又将 PreLoad 作为一个事件公开,您可以为其分配一个处理程序。无论如何,这会编译并接近您正在寻找的内容(使用 C 风格的注释来保留 WMD 语法突出显示)。

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    // this assigns Page_PreLoad as the event handler 
    // for the PreLoad event of the Control's Page property
    AddHandler Me.Page.PreLoad, AddressOf Page_PreLoad
    MyBase.OnInit(e)
End Sub

Private Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs)
    // do something here
End Sub

I'm not sure if that serves your purpose--as Stephen Wrighton indicated above, there may be a better way with one of the different events in the page lifecycle. However, building on what he said, this should work because the control's OnInit is called in which the event handler assignment is made, then the Page's OnLoad event is raised and then the event handler within the control is executed.

于 2009-02-25T16:59:10.643 回答
2

除非您选择 Jason 的选项,否则您要么被困在 INIT 事件(在加载 Viewstate 之前)或 PAGE LOAD 事件中执行操作。

我的问题是:有什么理由必须在 PreLoad 而不是 Load 事件中执行该操作?

请记住,Preload 真正做的唯一事情是将 Viewstate 和 PostBack 数据加载到各种控件中(有关生命周期的更多信息)。

LOAD 事件将在任何控制事件(例如按钮单击)之前发生,因此您可能会很好地在那里执行您的操作。唯一的原因是,如果您不希望 PostBack 或 Viewstate 数据干扰您的流程(无论出于何种原因),那么在这种情况下,您可以利用 INIT 事件。

于 2009-02-25T16:40:32.467 回答
0

为什么不创建一个方法来执行任何需要完成的预加载,并让您的页面调用该方法?

于 2009-02-25T16:33:02.470 回答