搜索谷歌和stackoverflow后我无法找到一个帮助我在我的情况下的答案。我有一个带有开始菜单(表单)的应用程序。当用户按下(任意)表格的X(关闭)时,我重新加载开始菜单。现在当该(菜单)表单关闭时,我想检查并通知用户现在任何隐藏的表单处于编辑模式(有或没有未保存的更改)如果用户按下取消我想显示该表单并停止关闭应用程序。现在我的问题是如何阻止应用程序停止在其他表单的代码中。我有一个覆盖调用this.close的子窗体的dispose方法,所以ok / cancel消息框显示但是在MB之后,开始菜单关闭,无论如何停止程序。我应该寻找一种处理这些东西的不同方法,还是要修改方法或事件处理程序以便这个/ \可以工作?
编辑: 好的,这是代码的一部分,按照被调用的顺序。我哪里出错?
private void Menu_FormClosing(object sender, FormClosingEventArgs e)
{
Global.Forms.Remove(this);
if (!Global.Clean_Forms())
{
e.Cancel = true;
Global.Forms.Add(this);
}
}
public static void Clean_Forms()
{
foreach (Form f in Forms)
{
if (f is Menu)
{
//do nothing
}
else
{
if (!f.IsDisposed)
{
f.Close();
}
}
}
if (Forms.Count != 0)
{
isClean = false;
/* String a = "";
foreach (Form f in Forms)
{
a += f.ToString() + ": ";
}
MessageBox.Show(a);*/
}
else
{
isClean = true;
}
}
然而,这不起作用,应用程序就会关闭。
随机形式的结束事件处理程序
private void persoon_form_FormClosing(object sender, FormClosingEventArgs e)
{
if (editing)
{
DialogResult dr;
dr = MessageBox.Show("uw wijzigingen gaan verloren. Doorgaan?", "sluiten", MessageBoxButtons.OKCancel);
if (dr == DialogResult.Cancel)
{
e.Cancel = true;
}
else if (dr == DialogResult.OK)
{
Global.size = this.Size;
Global.position = this.Location;
Global.Forms.Remove(this);
Form f = Global.menu();
f.Show();
this.Dispose();
}
}//somethingelse}
编辑:@cody grey更改onclose并且clean_form仍然没有效果,(不应该显示子窗体的Closing事件中的消息框吗?因为它没有)
答案 0 :(得分:7)
您不应该在Dispose
方法中执行此操作。相反,请尝试处理FormClosing
event。
此事件在表单关闭之前发生,因此您可以检查所需的状态,并在必要时通过将e.Cancel
设置为True来取消关闭。
例如:
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
// Check to see if the user is allowed to close this form
if (!allowClose)
{
// Prevent this form from being closed
MessageBox.Show("This form cannot be closed yet!");
e.Cancel = true;
}
}
答案 1 :(得分:0)
我想我想通了!我改变了两件事。 1我确保我没有在任何地方调用this.dispose,因为这会导致处理(不关闭)任何子表单,因此不会调用onclosing事件。 2. foreach循环检查主菜单是否可以关闭生成的集合时修改了错误。因此,我确保它以正确的顺序关闭,而Cody Gray指出我正确的方向:
Stack<Form> stack = new Stack<Form>();
foreach (Form f in Forms)
{
if (f is Menu)
{
//do nothing
}
else
{
if (!f.IsDisposed)
{
stack.Push(f);
}
}
}
for (int i = 0; i < stack.Count; i++)
{
Form temp = stack.Pop();
temp.Close();
}