我正在使用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属性。
答案 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
}