如何从用户控件处理页面事件? (VB.net)

时间:2009-02-25 16:30:39

标签: asp.net vb.net events user-controls page-lifecycle

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

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

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

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

感激不尽的任何帮助!

3 个答案:

答案 0 :(得分:5)

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

无论如何,在UserControl的Init中,您可以显式地将Page_PreLoad方法指定为UserControl的Page属性的PreLoad事件的处理程序,而不是使用方法声明中的“Handles”语法。您的示例正在尝试将事件处理程序分配给UserControl对象上的事件,以用于UserControl对象不引发的事件。如您所述,UserControl不会继承自PreLoad事件所在的Page。但是,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

我不确定这是否符合您的目的 - 正如Stephen Wrighton上面指出的那样,页面生命周期中的某个不同事件可能有更好的方法。但是,基于他所说的,这应该有效,因为调用控件的OnInit,在其中进行事件处理程序赋值,然后引发Page的OnLoad事件,然后执行控件中的事件处理程序。

答案 1 :(得分:2)

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

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

请记住,Preload唯一真正做的是将Viewstate和PostBack数据加载到各种控件中(更多info on the lifecycle)。

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

答案 2 :(得分:0)

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