- PR -

カスタムクラスをDropDownListにバインドするときのDataTextFieldにつきまして

投稿者投稿内容
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 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/05/16
投稿数: 36
投稿日時: 2008-07-30 15:42
力技になってしまいますが今回のケースだと
自分でddlShipMethod.Items[?].Textプロパティに
設定していく方法くらいしか思いつきませんね・・・。
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-30 15:56
引用:

もん吉さんの書き込み (2008-07-30 15:42) より:
力技になってしまいますが今回のケースだと
自分でddlShipMethod.Items[?].Textプロパティに
設定していく方法くらいしか思いつきませんね・・・。



もん吉様、
ご返答ありがとうございます。

ループ処理で一件一件追加していく方法ですね。
可能であれば、スマートに実装したいですが、、、
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-07-30 16:28
プレゼンテーションモデル (ビューに都合のいい形のモデル) を用意するのが良いかと思います。
ShopShipMethodInfo をラッピングする ShopShipMethodPM というクラス (名前は適当) を用意して、ShipMethodName プロパティを直接持たせるわけです。

[追記]
もしくは、単純に ShopShipMethodInfo に ShipMethodName プロパティを持たせるという手もありますね。

_________________
C#と諸々

[ メッセージ編集済み 編集者: よこけん 編集日時 2008-07-30 16:43 ]
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-30 17:01
よこけん様、
いつもありがとうございます。

引用:

よこけんさんの書き込み (2008-07-30 16:28) より:
プレゼンテーションモデル (ビューに都合のいい形のモデル) を用意するのが良いかと思います。
ShopShipMethodInfo をラッピングする ShopShipMethodPM というクラス (名前は適当) を用意して、ShipMethodName プロパティを直接持たせるわけです。



この場合ラップするとは、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をもつ形(集約)にした方が
ベターなのでしょうか?(※今回のスレッドの内容と関係ないので無視していただいても結構です。)


引用:

[追記]
もしくは、単純に ShopShipMethodInfo に ShipMethodName プロパティを持たせるという手もありますね。



よこけん様が追記してくださる前に上のプレゼンテーションモデルについても試行錯誤している途中にこちらの方法ひらめきました。こちらの方法が(自分の実力的にも)一番簡単なように思いました。


[ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-30 17:04 ]

[ メッセージ編集済み 編集者: 骨骨★Rock! 編集日時 2008-07-30 17:12 ]
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-07-30 22:05
引用:
骨骨★Rock!さんの書き込み (2008-07-30 17:01) より:

この場合ラップするとは、ShopShipMethodInfoを継承したShopShipMethodPMを作成すればよいのでしょうか。



いえ、継承は関係ありません。
ラップとはそのまま「包む」という意味です。

コード:
public class ShopShipMethodPM
{
    private readonly ShopShipMethodInfo _source;

    public ShopShipMethodPM(ShopShipMethodInfo source)
    {
        this._source = source;
    }

    public int ShopShipMethodId
    {
        get { return this._source.ShopShipMethodId; }
    }

    public string ShipName
    {
        get { return this._source.ShipMethod.shipMethodName; }
    }
}



こんな感じですね。
プレゼンテーションに必要となるプロパティを全て持たせ、プロパティの実装はラップ対象に委譲するだけです。

引用:
骨骨★Rock!さんの書き込み (2008-07-30 17:01) より:

「ご質問」
前回色々ご教授頂いた下記スレッドに関連してひとつご質問させて頂きたいのですが、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45711&forum=7
今回の場合も、ShopShipMethodInfoがShipMethodInfoをもつ形(集約)にした方が
ベターなのでしょうか?(※今回のスレッドの内容と関係ないので無視していただいても結構です。)


オブジェクト指向的には、ShopShipMethodInfo.ShipMethodId プロパティのような ID 値で関係を示すのではなく、
ShopShipMethodInfo.ShipMethod プロパティのように参照で関係を示す (関連を持つ) べきです。
ただ、僕には ShopShipMethodInfo と ShipMethodInfo の違いや役割がよくわからないので、
この 2 つのクラスが 1 つの集約になるのかどうかはわかりません。(関連を持つ≠集約)


引用:
骨骨★Rock!さんの書き込み (2008-07-30 17:01) より:

こちらの方法が(自分の実力的にも)一番簡単なように思いました。


問題がなければそれで充分です。
ShipName プロパティ以外にも色々必要になってきて、ごちゃごちゃしてしまうようならば、
その時はプレゼンテーションモデルを検討してみるといいと思います。

_________________
C#と諸々
骨骨★Rock!
常連さん
会議室デビュー日: 2007/09/11
投稿数: 38
投稿日時: 2008-07-30 22:41
よこけん様、
ご回答いただきましてありがとうございます。
なるほど!の連続でした。

引用:


いえ、継承は関係ありません。
ラップとはそのまま「包む」という意味です。

コード:
public class ShopShipMethodPM
{
    private readonly ShopShipMethodInfo _source;

    public ShopShipMethodPM(ShopShipMethodInfo source)
    {
        this._source = source;
    }

    public int ShopShipMethodId
    {
        get { return this._source.ShopShipMethodId; }
    }

    public string ShipName
    {
        get { return this._source.ShipMethod.shipMethodName; }
    }
}



こんな感じですね。
プレゼンテーションに必要となるプロパティを全て持たせ、プロパティの実装はラップ対象に委譲するだけです。



ご丁寧にコードまで記述いただきましてありがとうございます。
また理解が深まりました。

引用:

オブジェクト指向的には、ShopShipMethodInfo.ShipMethodId プロパティのような ID 値で関係を示すのではなく、
ShopShipMethodInfo.ShipMethod プロパティのように参照で関係を示す (関連を持つ) べきです。
ただ、僕には ShopShipMethodInfo と ShipMethodInfo の違いや役割がよくわからないので、
この 2 つのクラスが 1 つの集約になるのかどうかはわかりません。(関連を持つ≠集約)



なるほど、関連を持つ≠集約ですか。
前回のOderとOrderDetailでは集約に該当したので、OrderDetailクラスが不要となりました。これはご紹介頂いたページから抜粋した理由によるものだと想像します。
http://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap2.html#Aggregates

---------------------- 一部抜粋 ---------------------
『外部から参照できるのはルートだけで、中のオブジェクトに対する処理はすべてルートが中継する。こうすることで、集約内のモデルの一貫性を維持することができる。』

ケースバイケースなのかもしれませんが、集約を採用する基準など何かありますか。
(※もしもこのスレッド内で、スレッドタイトルとはあまり関係の無い内容について質問させて頂く事がふさわしくない場合には別途スレッドを立てて質問させて頂いてもよろしいでしょうか)

よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-07-31 00:56
引用:
骨骨★Rock!さんの書き込み (2008-07-30 22:41) より:

ケースバイケースなのかもしれませんが、集約を採用する基準など何かありますか。


うーん、難しいトコですね。
強いて言えば、集約ルートでないエンティティは、他の集約のエンティティから関連を持たれてはいけないので、他の集約のエンティティから関連を持たれるエンティティは、集約ルートとなります。そうでないならば集約に含めてしまっていいかと思います。
# ちなみに「関連を持つ≠集約」というのは、集約ルートと集約ルートの間の関連を指してます。

引用:
骨骨★Rock!さんの書き込み (2008-07-30 22:41) より:

もしもこのスレッド内で、スレッドタイトルとはあまり関係の無い内容について質問させて頂く事がふさわしくない場合には別途スレッドを立てて質問させて頂いてもよろしいでしょうか


確かに、スレッドタイトルと関係の無い内容を延々と続けるのはよろしくないかもしれませんね。
では、このスレでこの話題に関する私の返答はこれで最後ということにします。他にもまだ質問等がある場合は、別スレをお願いします。(僕もそんなに詳しい訳ではないのでお役に立てるかわかりませんが)
_________________
C#と諸々

スキルアップ/キャリアアップ(JOB@IT)