覆盖Form的OnFormClosing进行验证

时间:2011-02-17 22:12:37

标签: c# .net winforms

我打算重写OnFormClosing(System.Windows.Forms.Form)来执行对话框用户输入的验证。如果验证失败,那么我将把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的新手,所以对我应该进行验证的任何建议(如果这不是最佳方法)表示赞赏。

相关链接: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onformclosing.aspx

4 个答案:

答案 0 :(得分:6)

看起来很好。这取决于您的应用程序和基本表单的设计,以确定是否适合调用base.OnFormClosing(e)以及何时调用它(在开头或结尾),即如果您有自定义代码基本方法。

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

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

答案 1 :(得分:4)

调用base.OnFormClosing()方法是一个非常困难的要求,否则FormClosing事件不会运行。如果你已经将e.Cancel设置为true,是否这样做是一个判断调用。是否应该允许FormClosing事件处理程序覆盖它并将其设置为false?如果这对你有意义,那么不要快捷方式。 e.Cancel已经设置为真可能会使事件编写者感到神秘吗?然后做快捷方式。

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

答案 2 :(得分:-1)

你应该使用FormClosing事件处理程序,没有理由覆盖OnFormClosing,在FormClosing事件处理程序中将e.Cancel设置为true而没有别的,没有返回而没有其他东西......

答案 3 :(得分:-1)

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

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

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

        //Do Some Extra Work Here
    }