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");
}
}
一个简单的解决方案是:
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事件并阻止进一步验证。