【问题标题】:overriding Form's OnFormClosing for validation覆盖 Form 的 OnFormClosing 进行验证
【发布时间】:2011-02-17 22:12:37
【问题描述】:

我计划重写 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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    看起来不错。这实际上取决于您的应用程序和基本表单的设计,以确定是否适合调用 base.OnFormClosing(e) 以及何时调用它(在开始或结束时),即如果您在基本方法。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 来自我发布的 msdn 链接:“OnFormClosing 方法还允许派生类在不附加委托的情况下处理事件。这是在派生类中处理事件的首选技术。”另外,如果我这样做了,是否还会调用附加到 FormClosing 事件的任何其他委托?
        • 好的,那么你可以按照你的方式做,但肯定没有返回,我希望基本方法实现检查是否设置了 E.Cancel 并避免关闭以防它为“真”。
        【解决方案4】:

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

        public Form1()
            {
                InitializeComponent();
                this.FormClosing += ThisFormClosing;
            }
        
            void ThisFormClosing(object sender, FormClosingEventArgs e)
            {
                if (YouDontWantToClose)
                {
                    e.Cancel = true;
                    return;
                }
        
                //Do Some Extra Work Here
            }
        

        【讨论】:

        • Davide 已经提出了这个(错误的)答案,我建议您阅读与 his answer 相关的 cmets。
        • 我不知道您想要覆盖此表单,因为它没有被提及。对不起;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        相关资源
        最近更新 更多