web-dev-qa-db-ja.com

DialogResultを正しく使用する

最近の質問( 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();
            };
    }
27
Sayse

ShowDialogでモーダルダイアログを開くと、呼び出されたフォームが閉じるか非表示になるまで、呼び出し元のコードはブロックされます。呼び出されたフォームのいくつかのパブリックプロパティを読み取り、[OK]または[キャンセル]ボタンのクリックに基づいて処理(たとえば、データをデータベースまたはファイルに保存)する場合、ユーザーが希望するかどうかを知る必要があります。アクションを実行するかどうか。 ShowDialog()メソッドによって返されるDialogResultにより、適切なアクションを実行できます...

例えば

using (Form1 form = new Form1())
{
    DialogResult dr = form.ShowDialog();
    if(dr == DialogResult.OK)
    {
        string custName = form.CustomerName;
        SaveToFile(custName);
    }

}
20
Steve

Closeを呼び出すか、DialogResultプロパティを設定するかは、実際には問題ではありません。必ずDisposeを呼び出す必要があります。私はブロックを使用してこれを行うことを好む:

_using (Form1 form = new Form1())
{
    form.ShowDialog();
}
_

元々、ShowDialogメソッドが既に呼び出されているFormCloseを呼び出すことができると考えました。これはそうではありません。フォームをShowDialogでモーダルで表示する場合、Closeメソッドの結果として閉じられるか、DialogResultプロパティを設定するかは問題ではないようです。 DialogResultを設定することは、Formを閉じるためのショートカットにすぎないようです。

ただし、Closeを呼び出すか、DialogResultプロパティを設定するかにかかわらず、重要なのは、Dispose()を呼び出すか、フォームをusingブロックに入れることです。

4
Dan