C# 一次关闭与形式关闭或一次加载与形式加载之间的差异
我在VSTO中有一个表单addin。它有两种方法,onclose和Form_Closing 这两者有什么区别 我似乎无法从任何一份文件中找到答案 OnLoad和Form_-Load也是如此 谢谢 编辑:评论说OnClosing现在是OnFormClosing。如果是这样的话,什么是OnFormLoad?考虑到我必须注册这些活动,它的名字真的很重要吗 例如,我也有OnResize,是否调用了这些方法中的任何一个?我的意思是我从未在任何地方注册过。就像我做的Form_Load和Form_XXX函数一样。这是 每个事件C# 一次关闭与形式关闭或一次加载与形式加载之间的差异,c#,winforms,C#,Winforms,我在VSTO中有一个表单addin。它有两种方法,onclose和Form_Closing 这两者有什么区别 我似乎无法从任何一份文件中找到答案 OnLoad和Form_-Load也是如此 谢谢 编辑:评论说OnClosing现在是OnFormClosing。如果是这样的话,什么是OnFormLoad?考虑到我必须注册这些活动,它的名字真的很重要吗 例如,我也有OnResize,是否调用了这些方法中的任何一个?我的意思是我从未在任何地方注册过。就像我做的Form_Load和Form_XXX函数一
Foo
都有相应的受保护方法OnFoo
。该方法负责触发事件。(默认情况下,设计器将创建名为ctrl\u Foo
的事件处理程序)
这意味着大部分时间都应该使用事件注册,但有时可能需要覆盖OnFoo
实现。只有在需要时才这样做
项目同时执行这两个操作的事实可能表明存在编码错误。因此,这一切都是因为除了定义事件的类之外,您无法在任何类中调用事件 例如,以这个类
Foo
&派生类型FooChild
:
public class Foo
{
public event EventHandler Bar;
}
public class FooChild : Foo
{
public void SomeMethod(object sender, EventArgs e)
{
var bar = this.Bar;
if (bar != null)
{
bar(sender, e);
}
}
}
编译此文件时,我得到错误:
事件“Foo.Bar”只能出现在+=或-=的左侧(从类型“Foo”中使用时除外)
那么,我如何从一个子类引发事件呢
我们在Foo
中添加了一个OnBar
方法
public class Foo
{
public event EventHandler Bar;
protected virtual void OnBar(object sender, EventArgs e)
{
var bar = this.Bar;
if (bar != null)
{
bar(sender, e);
}
}
}
现在,在FooChild
中,我似乎可以通过两种方式访问事件:
public class FooChild : Foo
{
/* FIRST WAY */
public FooChild()
{
this.Bar += BarHandler;
}
private void BarHandler(object sender, EventArgs e)
{
/* Do Stuff */
}
/* SECOND WAY */
protected override void OnBar(object sender, EventArgs e)
{
base.OnBar(sender, e);
/* Do Stuff */
}
}
第一种方法是任何代码都可以附加到Foo
上的事件。它的语义是“事件已被触发,我正在响应它”
第二种方式略有不同。如果按上述方式实施,则其有效性与正常处理方法相同。但它可以做一些更强大的事情。它的语义是“类层次结构中的Foo
中的一些代码要求事件应该被触发,但如果将被触发,我将做出最终决定。”下面是一些可以做到这一点的代码:
public class FooChild : Foo
{
protected bool _suppressBarEvent = true;
protected override void OnBar(object sender, EventArgs e)
{
if (!_suppressBarEvent)
{
base.OnBar(sender, e);
}
}
}
因此,在本例中,我们已经覆盖了Bar
事件是否将被触发。这将影响已附加的所有事件处理程序
这就是####方法的真正目的。有不同的方法可以完成不同的工作
OnLoad
是触发事件的方法
Form\u Load
是“event handler”,它是在事件被触发时执行的方法。我的观点是,如果我从未注册它们,那么函数的名称就无关紧要了?onclose是一个受保护(接近私有)的方法。其中有一个。但是,可以向同一事件注册任意数量的事件处理程序(即不同的方法)。