2012-03-20 132 views
5

我使用ShowDialog打开窗体作为模态对话框。该对话反过来允许使用ShowDialog再次打开另一个窗体作为模式对话框。为什么关闭嵌套子对话框还关闭父对话框?

当最内层的对话框关闭时,这也会导致其父对话框关闭。为什么会发生这种情况,我该如何预防它?

我已经创建了一个hello世界版本的问题来说明这一点。

形式1:

Form 1

private void OpenForm2Button_Click(object sender, EventArgs e) 
{ 
    Form2 testForm = new Form2(); 
    DialogResult dialogResult = new DialogResult(); 
    dialogResult = testForm.ShowDialog(); 
    MessageBox.Show("Form 2 returned: " + Convert.ToString(dialogResult)); 
} 

表格2:

Form 2

... 
this.Form2OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; 
this.Form2CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; 
... 
this.AcceptButton = this.Form2OKButton; 
this.CancelButton = this.Form2CancelButton; 
... 
private void OpenForm3Button_Click(object sender, EventArgs e) 
{ 
    Form3 testForm = new Form3(); 
    DialogResult dialogResult = new DialogResult(); 
    dialogResult = testForm.ShowDialog(); 
    MessageBox.Show("Form 3 returned: " + Convert.ToString(dialogResult)); 
} 

表格3:

Form 3

... 
this.Form3OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; 
this.Form3CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; 
... 
this.AcceptButton = this.Form3OKButton; 
this.CancelButton = this.Form3CancelButton; 

重现步骤:

  • 点击 “打开表单2”
  • 点击 “打开型3”
  • 点击 “取消”

表3与关闭DialogResult ==按预期方式取消,但表单2也会以DialogResult ==取消(未预期)关闭。

+0

Mmh的,我试着和它[工作正常在我的机器上(http://codinghorror.typepad.com/.a/6a0120a85dcdae970b0128776ff992970c- PI)。我们应该看到整个(真实)代码来理解问题。您可以使用http://pastebin.com/粘贴很长一段代码... – digEmAll 2012-03-20 18:04:33

+0

也适用于我。 – 2012-03-20 18:08:42

+0

我在这里粘贴的代码:http://pastebin.com/Dj81gAze – 2012-03-20 18:34:12

回答

14

编辑:

问题是这个(文件:Form2.Designer.cs):

this.OpenForm3Button.DialogResult = System.Windows.Forms.DialogResult.Cancel; 

当您单击OpenForm3Button,该OpenForm3Button_Click事件处理结束后,将form.DialogResult自动设置到Cancel,它被关闭。

复位的OpenForm3ButtonDialogResult属性,它会如预期:)

+0

不知道如何设置。奇怪的是,它是在我的主项目中完成的,并且在我设置的hello世界中做了同样的事情。我两次都犯过同样的错误。现在完美运作。非常感谢。下次我会更仔细地检查这样的事情。 – 2012-03-20 23:28:42

+3

@WarrenBlumenow:如果先添加取消按钮,然后复制它(使用CTRL-C或CTRL-mousedrag)来创建打开按钮,则前者的所有属性都将被复制到后者中。它经常发生。 :) – digEmAll 2012-03-21 08:23:05

+1

哦,哇。似乎我有这个bug,因为我第一次在窗体上设置一个CancelButton,然后复制该按钮来做第二个按钮。似乎设置窗体的CancelButton会自动设置按钮的DialogResult。很高兴知道。 – Nyerguds 2016-06-01 08:44:51