控件不能覆盖层次结构中的Page_Load

时间:2012-05-09 22:59:41

标签: asp.net inheritance user-controls

我正在使用的 ChildClass 用户控件有一系列父类,最终继承自 System.Web.UI.UserControl

public BasestClass : AnotherClassExtendingUserControl
{
    private void Page_Load(object sender, EventArgs e)
    {
        // do some stuff
    }
}

public BaseClass : BasestClass
{
    // no Page_Load
}

链上的两个父类,Page_Load标记为 private 。 “中间”类显然不会覆盖它,但我需要在 ChildClass 用户控件的Page_Load中添加一些内容。

public ChildClass : BaseClass
{
    // think I need to override Page_Load here,
    // but there is no acceptable method to override
}

如何进入 ChildClass 的Page_Load?我需要操作的控件中存在 BaseClass BasestClass 中不存在的控件。

2 个答案:

答案 0 :(得分:2)

在执行Page_Load事件方法期间会引发Load(或OnLoad)事件,所以我建议将逻辑移到那里。您不应该在您的子课程中覆盖OnLoad方法时遇到问题。

答案 1 :(得分:1)

我复制了你的课程,只是改变了两件事:

BasestClass : System.Web.UI.UserControl

这不应该改变任何事情,因为你说BasestClass最终继承自UserControl

我还将此添加到BasestClass.Page_Load:

Response.Write("BasePage_Load");

现在,要解决您的问题:

您可以向ChildClass添加构造函数,并为Load事件添加事件处理程序。

public ChildClass()
{
        Load += new EventHandler(_Default_Load);
}

void _Default_Load(object sender, EventArgs e)
{
        Response.Write("Event Handler");
}

您还可以覆盖OnPreRender:

protected override void OnPreRender(EventArgs e)
{
       base.OnPreRender(e);
       Response.Write("OnPreRender");
}

完成上述所有操作后,会在响应中输出:

Event Handler
BasePage_Load
OnPreRender

如果您想确保Page_Load BasestClass方法已经在新代码之前运行,OnPreRender就是您做事的地方。