C# 覆盖形式';s OnFormClosing进行验证
我正计划重写OnFormClosing(System.Windows.Forms.Forms的)来验证对话框中的用户输入。如果验证失败,则我将FormClosingEventArgs的Cancel属性设置为true: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
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已经建议了这个(错误)答案,我建议您阅读与相关的评论。我不知道您想要覆盖此表单,因为它没有被提及。对不起;)