【问题标题】:Control cannot override Page_Load in hierarchy控件不能覆盖层次结构中的 Page_Load
【发布时间】:2012-05-09 22:59:41
【问题描述】:

我正在使用的 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 被标记为私有。 “中间”类显然不会覆盖它,但我需要在 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?我需要操作该控件中的一些控件,这些控件在 BaseClassBasestClass 中不存在。

【问题讨论】:

    标签: asp.net inheritance user-controls


    【解决方案1】:

    Page_Load(或Load)事件在执行OnLoad 事件方法期间引发,因此我建议将您的逻辑移到那里。从子类中重写 OnLoad 方法应该没有问题。

    【讨论】:

    • 不太对。 Page_Load 不是事件,它是 Load 事件的默认事件处理程序。我认为同时使用 OnLoad 和 Page_Load 的覆盖可能会在以后导致混乱,特别是如果出现一个继承自 ChildClass 的类。默认情况下,事件处理程序是自动连接的,而您每次覆盖 OnLoad 时都必须显式调用 base.OnLoad(e)。那只是我的 2 美分。
    • @mafue: OnLoad 是引发Load 事件的页面方法。在这种情况下,正确的方法是覆盖事件引发程序,而不是事件处理程序。更多详情请看这里:msdn.microsoft.com/en-us/library/ms178472.aspx
    • @mafue:也可以在这里查看我的答案:stackoverflow.com/questions/7664969/…
    • 这些链接都没有说 Page_Load 是一个事件。那是因为它不是:)
    • 它确实是这么说的。该图清楚地显示了第二列中的“页面事件”,以红色显示。 OnLoad 方法引发Load 事件,Page_Load 处理该事件。我不想和你争论,但你的评论是不正确的,它可能会混淆某人。
    【解决方案2】:

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 2018-07-10
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2017-03-20
      • 1970-01-01
      相关资源
      最近更新 更多