2012-03-20 86 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