Windows フォームのカスタム ダイアログから値を返す標準的な方法はありますか?
-
09-06-2019 - |
質問
したがって、現在私のプロジェクトには、ユーザーに誕生日などを要求するようなことを行うカスタム ダイアログがいくつかあります。今彼らはちょうど設定のようなことをしているところです this.Birthday
回答を取得すると、そのプロパティ (次のタイプ) DateTime?
, 、null は「キャンセル」を示します)。次に、呼び出し側は、 Birthday
ユーザーが何に答えたかを把握するために作成されたダイアログのプロパティ。
私の質問は、 このようなことを行うためのより標準的なパターンはありますか? 設定できることはわかっています this.DialogResult
基本的な OK/キャンセル については説明しますが、Windows フォームでフォームに「これが私が収集したデータです」と示すためのより一般的な方法はありますか?
解決
カスタム ダイアログでプロパティを公開するのが慣用的な方法だと思います。これは、標準ダイアログ (Select/OpenFileDialog など) が行う方法だからです。探している結果を返す ShowBirthdayDialog() メソッドを使用する方がより明示的で意図が明らかだと主張する人もいるかもしれませんが、フレームワークのパターンに従うのがおそらく賢明な方法です。
他のヒント
このようなことを行うためのより標準的なパターンはありますか?
いいえ、正しいアプローチを使用しているようです。
ダイアログが DialogResult.OK を返した場合は、ダイアログ内の必要なプロパティがすべて有効であると想定されます。
私にとって、標準のダイアログ応答を返すダイアログにこだわり、プロパティ経由で結果にアクセスするのが最善の方法です。
私が座っている場所から考えられる 2 つの理由は次のとおりです。
- 一貫性 - ダイアログでは常に同じことを行っており、質問の性質そのものがパターンが良いことを示唆しています (-:同様に問題は、これが良いパターンかどうかということです。
- ダイアログから複数の値を返すことができます。ここでもまったく新しい議論がありますが、応用的な実用主義は、状況によってはこれが望ましいことを意味します。値をパッケージ化して、値を戻すことができるようにすることが必ずしも適切または望ましいわけではありません。すべて一度に。
ロジックの流れも素晴らしいです。
if (Dialog == Ok)
{
// Do Stuff with the entered values
}
else
{
// Respond appropriately to the user cancelling the dialog
}
それは良い質問です - 私たちはこのようなことについて質問することになっています - しかし、私にとって、現在のパターンはまともなものです。
マーフ
モーダル入力ダイアログの場合、通常は ShowDialog をオーバーロードし、必要なデータのパラメータを渡します。
DialogResult ShowDialog(out datetime birthday)
一般的に、自分のプロパティを Form クラスが公開する 100 以上のプロパティと混合するよりも、発見して理解する方が簡単であることがわかります。
フォームの場合、通常はコントローラーと、読み取り専用プロパティを使用してデータを渡す IView インターフェイスがあります。
私はいつもあなたが説明したとおりにそれを行ってきました。もっと受け入れられるアプローチがあるかどうか知りたいと思っています。