- - PR -
カスタムクラスをDropDownListにバインドするときのDataTextFieldにつきまして
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-30 13:58
皆様、
いつもお世話になっております。 表題の件ですが、DropDownListにデータソースを指定してバインドする際に ちょっと困った事になったので皆様のお知恵を拝借できればと思い投稿させて頂きました。 //配送方法のカスタムクラス ShipMethodInfo{ int shipMethodId; int shipMethodName; . . . } //ショップごとの配送方法のカスタムクラス ShopShipMethodInfo{ int ShopShipMethodId; int ShopId; int ShipMethodId; . . . } //お店の配送方法(複数)を取得します。 List<ShopShipMethodInfo> list= GetShopShipMethodByShopId(shopId); //ドロップダウンにデータソースを設定 ddlShipMethod.DataSource = list; ddlShipMethod.DataValueField="ShopShipMethodId"; //ドロップダウンのTextFieldの値を設定 ddlShipMethod.DataTextField =""←ここでShipMethodNameを表示したいのですが、どうすればよいか分らずに行き詰ってしまいました。 ShopShipMethodInfoがShipMethodInfoを持つ形にしてみましたが、 ddlShipMethod.DataTextField ="ShipMethod.shipMethodName" のような記述ではダメでした。 アドバイスを頂けますと幸いです。宜しくお願いいたします。 [ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-30 14:18 ] | ||||||||||||||||
|
投稿日時: 2008-07-30 15:42
力技になってしまいますが今回のケースだと
自分でddlShipMethod.Items[?].Textプロパティに 設定していく方法くらいしか思いつきませんね・・・。 | ||||||||||||||||
|
投稿日時: 2008-07-30 15:56
もん吉様、 ご返答ありがとうございます。 ループ処理で一件一件追加していく方法ですね。 可能であれば、スマートに実装したいですが、、、 | ||||||||||||||||
|
投稿日時: 2008-07-30 16:28
プレゼンテーションモデル (ビューに都合のいい形のモデル) を用意するのが良いかと思います。
ShopShipMethodInfo をラッピングする ShopShipMethodPM というクラス (名前は適当) を用意して、ShipMethodName プロパティを直接持たせるわけです。 [追記] もしくは、単純に ShopShipMethodInfo に ShipMethodName プロパティを持たせるという手もありますね。 _________________ C#と諸々 [ メッセージ編集済み 編集者: よこけん 編集日時 2008-07-30 16:43 ] | ||||||||||||||||
|
投稿日時: 2008-07-30 17:01
よこけん様、
いつもありがとうございます。
この場合ラップするとは、ShopShipMethodInfoを継承したShopShipMethodPMを作成すればよいのでしょうか。 public class ShopShipMethodPM : ShopShipMethodInfo { private string shipName; public string ShipName { get { return this.ShipMethod.ShipName; } } } ここまではよかったのですが、ドロップダウンのデータソースを設定する部分でつまずきました。(涙 List<ShopShipMethodPM> list = (ShopShipMethodPM)ShopShipMethod.GetShopShipMethodByShopID(shopId); 無理やりキャストなんてできないですよね。 「ご質問」 前回色々ご教授頂いた下記スレッドに関連してひとつご質問させて頂きたいのですが、 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45711&forum=7 今回の場合も、ShopShipMethodInfoがShipMethodInfoをもつ形(集約)にした方が ベターなのでしょうか?(※今回のスレッドの内容と関係ないので無視していただいても結構です。)
よこけん様が追記してくださる前に上のプレゼンテーションモデルについても試行錯誤している途中にこちらの方法ひらめきました。こちらの方法が(自分の実力的にも)一番簡単なように思いました。 [ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-30 17:04 ] [ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-30 17:12 ] | ||||||||||||||||
|
投稿日時: 2008-07-30 22:05
いえ、継承は関係ありません。 ラップとはそのまま「包む」という意味です。
こんな感じですね。 プレゼンテーションに必要となるプロパティを全て持たせ、プロパティの実装はラップ対象に委譲するだけです。
オブジェクト指向的には、ShopShipMethodInfo.ShipMethodId プロパティのような ID 値で関係を示すのではなく、 ShopShipMethodInfo.ShipMethod プロパティのように参照で関係を示す (関連を持つ) べきです。 ただ、僕には ShopShipMethodInfo と ShipMethodInfo の違いや役割がよくわからないので、 この 2 つのクラスが 1 つの集約になるのかどうかはわかりません。(関連を持つ≠集約)
問題がなければそれで充分です。 ShipName プロパティ以外にも色々必要になってきて、ごちゃごちゃしてしまうようならば、 その時はプレゼンテーションモデルを検討してみるといいと思います。 _________________ C#と諸々 | ||||||||||||||||
|
投稿日時: 2008-07-30 22:41
よこけん様、
ご回答いただきましてありがとうございます。 なるほど!の連続でした。
ご丁寧にコードまで記述いただきましてありがとうございます。 また理解が深まりました。
なるほど、関連を持つ≠集約ですか。 前回のOderとOrderDetailでは集約に該当したので、OrderDetailクラスが不要となりました。これはご紹介頂いたページから抜粋した理由によるものだと想像します。 http://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap2.html#Aggregates ---------------------- 一部抜粋 --------------------- 『外部から参照できるのはルートだけで、中のオブジェクトに対する処理はすべてルートが中継する。こうすることで、集約内のモデルの一貫性を維持することができる。』 ケースバイケースなのかもしれませんが、集約を採用する基準など何かありますか。 (※もしもこのスレッド内で、スレッドタイトルとはあまり関係の無い内容について質問させて頂く事がふさわしくない場合には別途スレッドを立てて質問させて頂いてもよろしいでしょうか) | ||||||||||||||||
|
投稿日時: 2008-07-31 00:56
うーん、難しいトコですね。 強いて言えば、集約ルートでないエンティティは、他の集約のエンティティから関連を持たれてはいけないので、他の集約のエンティティから関連を持たれるエンティティは、集約ルートとなります。そうでないならば集約に含めてしまっていいかと思います。 # ちなみに「関連を持つ≠集約」というのは、集約ルートと集約ルートの間の関連を指してます。
確かに、スレッドタイトルと関係の無い内容を延々と続けるのはよろしくないかもしれませんね。 では、このスレでこの話題に関する私の返答はこれで最後ということにします。他にもまだ質問等がある場合は、別スレをお願いします。(僕もそんなに詳しい訳ではないのでお役に立てるかわかりませんが) _________________ C#と諸々 |