C# 覆盖形式';s OnFormClosing进行验证

C# 覆盖形式';s OnFormClosing进行验证,c#,.net,winforms,C#,.net,Winforms,我正计划重写OnFormClosing(System.Windows.Forms.Forms的)来验证对话框中的用户输入。如果验证失败,则我将FormClosingEventArgs的Cancel属性设置为true: protected override void OnFormClosing(FormClosingEventArgs e) { if (DialogResult == DialogResult.OK) { if (!IsDialogInputVali

我正计划重写OnFormClosing(System.Windows.Forms.Forms的)来验证对话框中的用户输入。如果验证失败,则我将FormClosingEventArgs的Cancel属性设置为true:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (DialogResult == DialogResult.OK)
    {
        if (!IsDialogInputValid())
        {
            e.Cancel = true;
            return;          // Is not calling the base class OnFormClosing okay here?
        }
    }
    base.OnFormClosing(e);
}
我的问题:我是否应该调用基类“OnFormClosing”,即使我取消了关闭(也就是说,我是否应该删除上面的提前返回)

我目前的想法是,我不应该调用它,因为当对话框本身决定它不关闭时,附加到FormClosing事件的代理不会被调用。另一方面,我担心基类的OnFormClosing可能会做其他必要的事情

仅供参考,我是Winforms的新手,因此对于我应该如何执行验证(如果这不是最佳方法)的任何建议,我们都将不胜感激

相关链接:

您应该在FormClosing事件处理程序集合e中使用FormClosing事件处理程序,无需重写OnFormClosing。Cancel设置为true,除此之外没有其他内容,没有返回,也没有其他内容……

看起来不错。实际上,这取决于应用程序和基窗体的设计,以确定是否适合调用base.OnFormClosing(e)以及何时调用它(在开始或结束时),即是否在基方法中有自定义代码

看看这个例子,是否有理由重写OnFormClosing?如果DialogResult设置为OK,您不能/不应该进行验证吗?如果输入无效,则不应将对话框设置为OK,也不应调用Close()。通常,OnFormClosing用于处理任何清理,并提示用户询问他们是否真的要取消当前任务(通常用于当他们点击表单上的X时)


回到手头的问题之一,如果输入无效,您可以安全地调用return。如果不打算实际关闭,则没有理由调用base.OnFormClosing()。是否调用base.OnFormClosing()取决于基本方法中的逻辑。

调用base.OnFormClosing()方法是一项非常困难的要求,否则FormClosing事件不会运行。如果您已经将e.Cancel设置为true,是否这样做是一个判断调用。是否应该允许FormClosing事件处理程序重写它并将其设置回false?如果这对你有意义,那就不要走捷径。事件编写器是否可能会被e.Cancel设置为true而迷惑?然后走捷径


在这种情况下,我会选择后者,因为它是一个对话框。

我建议您使用事件处理程序。像这样:

public Form1()
    {
        InitializeComponent();
        this.FormClosing += ThisFormClosing;
    }

    void ThisFormClosing(object sender, FormClosingEventArgs e)
    {
        if (YouDontWantToClose)
        {
            e.Cancel = true;
            return;
        }

        //Do Some Extra Work Here
    }

在我发布的msdn链接中:“OnFormClosing方法还允许派生类在不附加委托的情况下处理事件。这是在派生类中处理事件的首选技术。”此外,如果我这样做,附加到FormClosing事件的任何其他代理不会仍然被调用吗?好的,那么你可以按照你的方式执行,但肯定没有返回,我希望基本方法实现检查是否设置了E.Cancel,并避免在它为“true”时关闭。Davide已经建议了这个(错误)答案,我建议您阅读与相关的评论。我不知道您想要覆盖此表单,因为它没有被提及。对不起;)