我在VSTO插件中有一个表单。它有两个方法,OnClosing和Form_Closing。
这两者有什么区别?
我似乎无法用任何文档来解决这个问题。
同样适用于OnLoad和Form_Load。
由于
编辑:评论说OnClosing现在是OnFormClosing。那么如果是这样的话那么OnFormLoad是什么?考虑到我必须注册事件,这真的很重要吗?
例如我也有OnResize,是否调用了这些方法?我的意思是我从未在任何地方登记过就像我使用Form_Load和Form_XXX函数一样。
答案 0 :(得分:1)
这是recommended pattern for implementing events。
每个事件Foo
都有相应的受保护方法OnFoo
。该方法负责触发事件。 (默认情况下,设计人员将创建名为ctrl_Foo
)的事件处理程序。
这意味着大多数时间应该使用事件注册,但有时可能需要覆盖OnFoo
实现。 仅在需要时。
项目两者的事实可能表明编码不当。
答案 1 :(得分:1)
所以这一切都是因为除了定义它之外的任何类都不能调用事件。
因此,举例来说,请参加此课程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'类型中使用)
那么,我如何从子类中提升事件?
我们向OnBar
添加Foo
方法。
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
事件。这会影响已附加的所有事件处理程序。
这是On###
方法的真正目的。
答案 2 :(得分:0)
有不同的方法可以完成不同的工作
OnLoad
是触发事件的方法
Form_Load
是“事件处理程序”,在触发事件时执行的方法。