form.dispose()总是调用验证事件并显示弹出消息

本文关键字:事件 显示 消息 验证 调用 dispose form | 更新日期: 2023-09-27 18:12:27

当我调用form.dispose()表单总是调用验证事件并显示MessageBox消息。我怎么能防止当form.dispose()正在执行验证事件将不触发。我在验证事件中有MessageBox.Show()消息,所以当form.Dispose()执行时,它们总是在顶部。

这有可能阻止退出吗?我使用的是compact framework 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");
   }
}

form.dispose()总是调用验证事件并显示弹出消息

一个简单的解决方案是:

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();
    }
}

在表单上显式调用Dispose()是否有原因?

窗体关闭前不应该调用Dispose()。这让你有机会处理OnClosing或OnClosed事件上任何需要的验证,并禁用进一步的验证和消息框。

关于代码的注释:

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