form.dispose()始终调用Validating事件并显示弹出消息

时间:2011-10-27 09:09:24

标签: c# .net winforms

当我调用form.dispose()表单时总是调用Validating事件并显示MessageBox消息。 如何在form.dispose()执行时阻止验证事件不会触发。我在验证事件中有MessageBox.Show()条消息,因此在form.Dispose()执行时它们始终位于顶部。

这是否可以防止退出?我正在使用紧凑的框架3.5

代码:

public static void Close<T>(string formName) where T : Form
{
    Form f = null;
    if (Dict.TryGetValue(formName, out f))
    {
        Dict.Remove(formName);
        f.Dispose();
    }
}

和验证事件

private void acPredmetObravnave_Validating(object sender, CancelEventArgs e)
{
   if (....)
   {
       MessageBox.Show("Error");
   }
}

2 个答案:

答案 0 :(得分:3)

一个简单的解决方案是:

public class MyForm: Form
{
    public InternalClose = false;

    // Your code...


    private void acPredmetObravnave_Validating(object sender, CancelEventArgs e)
    {
        if (InternalClose ) return;
        if (....) MessageBox.Show("Error");
    }
}

然后

public static void Close<T>(string formName) where T : MyForm
{
    MyForm f = null;
    if (Dict.TryGetValue(formName, out f))
    {
        Dict.Remove(formName);
        f.InternalClose = true;
        f.Close();
        f.Dispose();
    }
}

答案 1 :(得分:2)

您是否有理由在表单上显式调用Dispose()?

在关闭表单之前,不应该调用Dispose()。这使您有机会在OnClosing或OnClosed事件上处理任何所需的验证,并禁用进一步的验证和消息框。

关于您的代码的备注:

  • 为什么Close方法是通用的?
  • 您不应该在静态字典中保存表单引用。您可能会导致内存泄漏。
  • 在调用Dispose()之前,请禁用验证。尝试使用CausesValidation属性为false来执行此操作。
  • 或者,在内部表单中,处理OnClosing事件并阻止进一步验证。