我有一个非常简单的WinForms应用程序,它由三种形式组成:Form1,Form2和Form3。 Form1是主要的应用程序窗口。通过点击此窗口中的按钮,用户可以通过调用ShowDialog(this)
打开Form2作为模式对话框。同样,Form2有另一个按钮,通过另一个ShowDialog(this)
调用打开Form3。在每种情况下this
分别指向托管:Form1和Form2。
这一切都很好,直到Form3中的用户名称OK按钮。此时,Form3和Form2模式窗口都关闭,用户返回到Form1。从逻辑上讲,用户应该返回到Form2,从而启动Form3。为什么会这样?谢谢。
Form1在以下代码中打开Form2:
private void form1_ButtonClick(object sender, EventArgs e)
{
Form2 settings = new Form2();
DialogResult result = settings.ShowDialog(this);
if (result == DialogResult.OK)
{ }
}
然后Form2在此代码中打开Form3:
private void form2_ButtonClick(object sender, EventArgs e)
{
Form3 settings = new Form3();
DialogResult result = settings.ShowDialog(this);
if (result == DialogResult.OK)
{ }
}
有趣的是,退出函数form2_ButtonClick()后的调试器会立即进入form1_ButtonClick()作为下一步。我检查了所有处理程序的调用,并没有看到与表单关闭相关的任何代码。即使我评论我们的处理程序表单的所有代码仍然是级联的。
我怀疑表格关闭是由于分配给表单按钮的对话框结果,所以我禁用了两者并添加了显式按钮处理程序。结果保持不变。另外,我在两个函数中都注释掉了对话结果的所有处理。尽管如此,关闭Form3还会神奇地关闭其父Form2并直接删除到Form1。
根据建议,我还添加了显式的Form2.FormClosing()处理程序并在那里放置了断点。是的,在关闭Form3时立即调用此处理程序,而没有任何建议此调用的代码。
无法找到原因,我按照以下方式通过@Otterprinz和修改后的处理程序提供了宝贵的建议。
private bool allowClose = true;
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (!allowClose)
{
e.Cancel = true;
allowClose = true;
}
}
在显示Form3之前,我指定了allowClose = false
。它可以阻止Form2突然关闭。为什么会发生这种情况我不知道。形式并不复杂。我仔细检查了他们的源代码,没有看到任何错误。这些不是我设计的第一种,甚至不是第100种形式。从未见过这种效果。但是,至少我已经找到了解决方案,因为你提出了宝贵的建议。谢谢大家的评论!
答案 0 :(得分:0)
在winform项目上测试,它按预期工作。 Asker的代码可能与他发布的代码不同(相当于)。
// form1,form2,form3 are default forms
// form1 button handler
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
DialogResult result = form.ShowDialog(this);
}
// form2 button handler
private void button1_Click(object sender, EventArgs e)
{
Form3 form = new Form3();
DialogResult result = form.ShowDialog(this);
}
关闭时,form3将焦点和控制权返回给form2。 Gif显示行为https://media.giphy.com/media/3ohs4lqu1NIy4i7hEA/giphy.gif
答案 1 :(得分:0)
Form2 settings = new Form2();
DialogResult result = settings.ShowDialog(this);
// ShowDialog will wait settings close