2012-03-20 15 views
5

私は、ShowDialogを使用してモーダルダイアログとしてフォームを開きます。このダイアログでは、ShowDialogを使用して別のフォームを再びモーダルダイアログとして開くことができます。なぜ、ネストされた子ダイアログを閉じると、親ダイアログも閉じますか?

最も内側のダイアログを閉じると、親ダイアログも閉じます。なぜこれが起こり、どうすればそれを防ぐことができますか?

私はこれを説明するために問題のhello worldバージョンを作成しました。

フォーム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 == Cancel(期待していません)で終了します。

+0

MMHは、私が試した、それは[私のマシン上で正常に動作](http://codinghorror.typepad.com/.a/6a0120a85dcdae970b0128776ff992970c- pi)。問題を理解するためのコード全体を見るべきです。あなたは長いコードを貼り付けるためにhttp://pastebin.com/を使うことができます... – digEmAll

+0

私のためにも動作します。 –

+0

私はここにコードをペーストしました:http://pastebin.com/Dj81gAze –

答えて

14

EDIT:

問題はこの1つ(ファイル:Form2.Designer.cs):ある

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

あなたがOpenForm3Buttonをクリックすると、OpenForm3Button_Clickイベントハンドラの終了後、form.DialogResultが自動的に設定されていますCancelに移動して閉じます。

OpenForm3ButtonDialogResultプロパティをリセットし、期待どおりに動作します:)

+0

どのように設定されているか分かりません。奇妙なことは、私のメインプロジェクトでそれを行い、私がセットアップした世界で同じことをしたことです。私は両方の時に同じ間違いをしたに違いない。今は完璧に動作します。どうもありがとう。次回はもっと慎重にそのことを確認します。 –

+3

@WarrenBlumenow:キャンセルボタンを最初に追加し、それをコピーして(CTRL-CまたはCTRL-mousedragを使用して)オープンボタンを作成すると、前者のすべてのプロパティが後者にコピーされます。それは非常に頻繁に起こります。 :) – digEmAll

+1

ああ、うわー。最初にフォームにCancelButtonを設定し、そのボタンをコピーして2番目のボタンを作成したので、このバグが発生したようです。フォームのCancelButtonが自動的にボタンのDialogResultを設定するようです。知っておいてよかった。 – Nyerguds

関連する問題