最近の質問( Here )に対する回答で、Hans Passantはform.Close()
の代わりにDialogResult
を設定してフォームを閉じるべきだと述べましたが、理由を明らかにする?
正しく読んだ場合、MSDNのドキュメントには、.Close()
が実行すると信じていたフォームを正しく破棄するのではなく、フォームを非表示にするだけであると記載されています。
抽出 ドキュメントから。
ユーザーがダイアログボックスの[閉じる]ボタンをクリックしたとき、またはDialogResultプロパティの値を設定したときに、Closeメソッドは自動的に呼び出されません。代わりに、フォームは非表示になり、ダイアログボックスの新しいインスタンスを作成せずに再び表示できます。この動作のため、フォームがアプリケーションで不要になったときに、フォームのDisposeメソッドを呼び出す必要があります。
一方、MicrosoftはDialogResultプロパティの使用方法を示す サポートページ を作成しており、この「動作確認」セクションでクリックするとフォームが閉じると記載されています。
したがって、私の質問は2つあります。代わりにCloseまたはDialogResultを引き続き使用する必要があります。そして、ダイアログ結果はフォームを閉じるか非表示にします。以下で作成したコード(2つのボタンを持つ単純なフォーム)から、this.Close()
のブレークポイントがヒットした場合にのみ実際に非表示になっているように見えます。(this.Close()
をコメントすると、フォームは消えます、非表示かどうかわからない)
public Form1()
{
InitializeComponent();
button1.Click += (s, e) =>
{
//I edited my question to include using
using(Form1 form = new Form1())
{
form.ShowDialog();
}
};
button2.Click += (s, e) =>
{
this.DialogResult = DialogResult.OK;
this.Close();
};
}
ShowDialogでモーダルダイアログを開くと、呼び出されたフォームが閉じるか非表示になるまで、呼び出し元のコードはブロックされます。呼び出されたフォームのいくつかのパブリックプロパティを読み取り、[OK]または[キャンセル]ボタンのクリックに基づいて処理(たとえば、データをデータベースまたはファイルに保存)する場合、ユーザーが希望するかどうかを知る必要があります。アクションを実行するかどうか。 ShowDialog()メソッドによって返されるDialogResultにより、適切なアクションを実行できます...
例えば
using (Form1 form = new Form1())
{
DialogResult dr = form.ShowDialog();
if(dr == DialogResult.OK)
{
string custName = form.CustomerName;
SaveToFile(custName);
}
}
Close
を呼び出すか、DialogResult
プロパティを設定するかは、実際には問題ではありません。必ずDispose
を呼び出す必要があります。私はブロックを使用してこれを行うことを好む:
_using (Form1 form = new Form1())
{
form.ShowDialog();
}
_
元々、ShowDialog
メソッドが既に呼び出されているForm
でClose
を呼び出すことができると考えました。これはそうではありません。フォームをShowDialog
でモーダルで表示する場合、Close
メソッドの結果として閉じられるか、DialogResult
プロパティを設定するかは問題ではないようです。 DialogResult
を設定することは、Form
を閉じるためのショートカットにすぎないようです。
ただし、Close
を呼び出すか、DialogResult
プロパティを設定するかにかかわらず、重要なのは、Dispose()
を呼び出すか、フォームをusingブロックに入れることです。