WinForms级联模式对话框

时间:2018-01-30 10:15:49

标签: c# winforms

我有一个非常简单的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种形式。从未见过这种效果。但是,至少我已经找到了解决方案,因为你提出了宝贵的建议。谢谢大家的评论!

2 个答案:

答案 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