我打算重写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
答案 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
}