DialogResultではなくオブジェクトを返すWindowsフォームモーダルダイアログ
-
04-07-2019 - |
質問
私はこれに少しこだわっているので、誰かが私を助けてくれることを願っています。
Winformsアプリケーションを実行していますが、値を返すモーダルダイアログ(form.ShowDialog)を表示する必要があります(ユーザーにいくつかの値を要求し、それらをオブジェクトにラップします)。
オブジェクトへの参照を与えたり、後で何らかの形でpublicプロパティに依存してデータを読み取るのではなく、これを行う方法がわかりません。
ShowDialogに異なるものを返させたいのですが、それは機能しません。 いくつかの「良い」ものです。これを行う方法?
問題は新しいものではないと確信していますが、これ以上Winformsを実行する人はほとんどいないようであるため、Webでガイダンスを見つけることができません。
解決
次のように、静的メソッドをフォームに追加します。
public class MyDialog : Form
{
// todo: think of a better method name :)
public static MyObject ShowAndReturnObject()
{
var dlg = new MyDialog();
if (new dlg.ShowDialog() == DialogResult.OK)
{
var obj = // construct an instance of MyObject from dlg
return obj;
}
else
{
return null;
}
}
}
このようにして、プログラムからこれを呼び出すことができます:
var myObject = MyDialog.ShowAndReturnObject();
...およびダイアログをキャンセルすると、myObjectはnullになります。
今、すべてを言ったが、ShowDialog()を呼び出した後に読み込むプロパティをフォームのクラスに追加する方が良い方法だと思います。
他のヒント
戻り値を表すパブリックプロパティをダイアログ内に作成できます。
/* Caller Code */
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
MessageBox.Show(dlg.MyResult);
/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }
private void btnOk_Click(object sender, EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
または、基本的にMatt Hamiltonの機能を実行する新しいShowDialogメソッドをフォームクラス内に作成することもできます。問題の多くのフォームに対して行う場合、拡張メソッドである可能性があります。
ダイアログフォームのパブリックプロパティは理にかなっています。ただし、[OK]ボタンクリックイベントハンドラーでダイアログを閉じないでください。 DialogResultプロパティを割り当てると、ダイアログフォームが非表示になります。次に、呼び出し元のフォームで、DialogResultを調べることにより、[OK]または[キャンセル]がクリックされたかどうかを判断できます。 [OK]ボタンがクリックされた場合、パブリックプロパティにアクセスして、ダイアログフォームを破棄できます。これは、呼び出しフォームでtry-catch-finallyブロックを使用するか、usingステートメントを使用して行う必要があります。メモリリークを防ぐために、モーダルダイアログを破棄する必要があります。