我如何在Handler

时间:2016-02-19 20:00:30

标签: c# asp.net

我正在使用ASP.NET中的Web窗体,我想了解为什么我可以省略覆盖事件处理程序中的参数?

这是事件:

public event EventHandler Init;

这是代表保留数据(带有两个参数):

public delegate void EventHandler(object sender, EventArgs e);

事件处理程序如下:

protected override void OnInit(EventArgs e)
{
      i++;
      this.Load += Page_Load;
}

在上面的方法(处理程序)中不允许添加参数,但同时我们被限制为在下面的情况下传递参数

protected void Page_Load(object sender, EventArgs e)
{
    i++;
    Response.Write(i);
}

注意:我已在Directive中禁用了Auto Event Wire-Up属性。

2 个答案:

答案 0 :(得分:1)

实际上你没有订阅Init事件。 AutoEventWireUp确保在触发Init Event时调用Page_Init方法。

当你禁用它时,你必须手动连接这个方法

protected override void OnPreInit(EventArgs e)
{
    Init += new EventHandler(OnInit); 
    base.OnPreInit(); // make sure you call this
}

您不会遇到编译时错误的原因是因为有两种类型的EventHandler委托

EventHandler(object,EvnetArgs)
EvnetHandler(EventArgs)

答案 1 :(得分:0)

不同之处在于Page_Load实际上是一个事件处理程序,而OnInit是在基类中定义的方法并引发Init事件。因此,对于OnInit方法,您将覆盖该方法而不是定义事件处理程序。

如果要为Init事件创建事件处理程序,则还必须创建具有以下签名的方法:

protected void Page_Init(object Sender, EventArgs e)
{
    // ...
}

仅当AutoEventWireUp设置为true时才有效。否则,您需要在ASPX页面或代码隐藏文件中注册事件处理程序。由于Init事件在页面生命周期中非常引发,因此需要在请求开始时注册事件处理程序。在Init的特殊情况下,覆盖OnInit而不是定义事件处理程序是很常见的。但需要注意的是,如果覆盖OnInit(或其他On*方法之一),则应始终调用基本版本以允许ASP.NET框架执行其操作:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    // initialization code
}