OnClosing和Form_Closing或OnLoad和Form_Load

时间:2015-06-13 01:23:54

标签: c# winforms

我在VSTO插件中有一个表单。它有两个方法,OnClosing和Form_Closing。

这两者有什么区别?

我似乎无法用任何文档来解决这个问题。

同样适用于OnLoad和Form_Load。

由于

编辑:评论说OnClosing现在是OnFormClosing。那么如果是这样的话那么OnFormLoad是什么?考虑到我必须注册事件,这真的很重要吗?

例如我也有OnResize,是否调用了这些方法?我的意思是我从未在任何地方登记过就像我使用Form_Load和Form_XXX函数一样。

3 个答案:

答案 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是“事件处理程序”,在触发事件时执行的方法。