さて、では作ってみるかと、いじってて感動。ASP.NETのDataGridとLINQが出会うとここまでやるかという恐ろしくコードレスな世界が展開できるらしいです。
まずは、DBML、LINQtoSQLのオブジェクトを作ります。データベースはポケモン不思議のダンジョン依頼リストサイト化計画のものです。
で、ここから取ってくるデータを想定して、DataGridをデザインします。RANK(依頼ランク)、DNGN(ダンジョン)、RWD(報酬)、PWD(パスワード)のそれぞれをBoundFieldにセット。この辺りはVisualStadio2005とそんなに変わってないかなぁと。
さぁここからだ。このDataGridへのバインドなんだけど、LINQが返すオブジェクトをそのまま割り当てても動くんです。つまり、SELECT結果そのままバインドしちゃうと、たった3行で一覧画面の出来上がりです。
Dim pMContext As nListDataContext = New nListDataContext
Gd.DataSource = From L In pMContext.pMission _
Select _
DNGN = L.dMaster.DNAME & "(" & L.FLR & "F)", _ RANK = L.RNK & "(" & L.LVL & ")", _ RWD = L.RWRD, _
PWD = L.PWD1 & " " & L.PWD2 & " " & L.PWD3 & " " & L.PWD4 & " " & L.PWD5 & " " & L.PWD6
Gd.DataBind()
コツは、列名のコンテキストをきちんと決めて割り当てておくところ。BoundFieldではフォーマット関数も用意されているのでこれを使ってGrid表示時に整形してしまうのもありですけれど、今回は複数の列をあわせて一列にしてるのでこのSQL文?で。それにしても……LINQおそるべし(笑)
うおー、表示できてるよ。おー、まじっすか?(かんどー)
囚人さんから教えていただいて、LINQDataSourceを使ってみてさらに感動!
ただ、ちょっと「?」とおもったのが、
- あるテーブルAから生成したFormView内に新しいコントロール(コンボボックスとか)を配置
- 新しいコントロールに対して、LINQDataSourceでテーブルBを割り当てようとする
- LINQDataSource生成ウィザードでテーブル選択しても、必ずテーブルAを選択したことになって処理が継続する
- SQLDataSourceだとウィザードでテーブルBを選択してそのままテーブルBの列を選択できるようになる
これってフィードバック?(やったことが無いので判らないらしい)