- PR -

【ASP.Net】DataGrid Templatecolumn のデータバインドについて

1
投稿者投稿内容
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-02-25 13:46
初めまして ジョン吉と言います
早速ですが、

VisualStudio2003 のデザイナーでDataGridを追加し、そこへ Templatecolumn を配置し、
その中に、Labelコントロールを配置しました。

そのLabel に対して、デザイナーのプロパティウインドゥにてデータバインドを下記のように設定しました

カスタム連結式を選択し
更新区分.Get名称((DataBinder.Eval(Container, "DataItem.入会区分")))
と設定(DataItem.入会区分はDataSetで定義済)

そうすると、HTMLとしては

<ASP:DATAGRID id=DGrid runat="server" DATAMEMBER="#" AUTOGENERATECOLUMNS="False" DATASOURCE="<%# # %>" >
<COLUMNS>
<ASP:TEMPLATECOLUMN headertext="入会区分">
<ITEMTEMPLATE>
<ASP:LABEL id="lbl入会区分" runat="server"
Text='<%# 更新区分.Get名称((DataBinder.Eval(Container, "DataItem.入会区分"))) %>'>
</ASP:LABEL>
</ITEMTEMPLATE>
</COLUMNS>
</ASP:DATAGRID>

と設定されます。

DBの値が数値のため、関数をかませて文字列変換した値をLabelに設定するということで、
これはこのままうまく動作しています。

で、質問はデザイナではオリジナルの関数(ここでは、更新区分.Get名称)を使用する場合、
あくまでも文字列として設定するため、スペルミスなどがあった場合、実行時までわからないというのと、
画面数も多く、一覧表の列も多いとき、いちいちデザイナで設定するのはとても煩雑です。

この設定をコードビハインド側でコーディングすることはできないでしょうか?

全ての列(もしくは必要な列のみ)を実行時に動的に追加することも考えましたが、
基本的にデザイン側で設定可能な部分は全てそちらですることが望ましいと考えています

根本的なところとしては、Templatecolumn にデザインで配置したコントロールに、
コードビハインド側から各プロパティにアクセス可能か?
ということだと思います。

ItemDataBound にて実際のラベルコントロールにアクセスして、表示内容を設定するというのもありかなとは思うのですが、
せっかくのASP.Netの機能なので、できればゴリゴリコーディングせず、
必要最小限にしたいなと考えます

お知恵をお貸しください
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-02-25 21:18
引用:

<ASP:LABEL id="lbl入会区分" runat="server"
Text='<%# 更新区分.Get名称((DataBinder.Eval(Container, "DataItem.入会区分"))) %>'>
</ASP:LABEL>


Get名称で取得している入会区分名称(?)をDataSourceのなかに入れたらどうでしょうか。つまり、XXXテーブルと入会区分テーブルを結合するという意味です。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-02-25 21:23
 「$A」とか「$B」とかで書いて、[CTRL]+[H]とか。。。ダメ?


 Accessさんのポストを見て、そういうのもありなら。

 DbDataAdapter.Fillメソッドで、DataTableにごっそりいれるのではなく、IDataReaderで1行ずつ読み込みながら、DataTable.NewDataRowとDataTable.Rows.Addメソッドを使って登録するようにすると、SELECT文に書かなかった列を作り出すこともできます。ただ、この場合すべての行がRowState.Addedになってしまうので、読み込みが終わった時点でDataTable.AcceptChangesメソッドを実行するという方法もあります。
_________________
ジョン吉
常連さん
会議室デビュー日: 2005/02/25
投稿数: 33
投稿日時: 2005-02-28 09:24
Accessさん Jittaさん ありがとうございます

DataSource にあらかじめテーブルを用意して、そのテーブルと結合するというアイデアは考えつきませんでした。
今後のテクニックの一つとしてメモらせていただきます。

DataRaderを使うというのも一つ方法だとおもいます。

私なりに調べてみたのは、
<ASP:DATAGRID id=DGrid runat="server" 省略>
<COLUMNS>
<ASP:TEMPLATECOLUMN headertext="入会区分">
<ITEMTEMPLATE>
<ASP:LABEL id="lbl入会区分" runat="server"

デザイナーでテンプレートカラムを作成すると、HTMLでは
上記のように作成されるので、
ctype(DGrid.Columns(0),TEMPLATECOLUMN).controls(0)
とかして、lbl入会区分 に直接アクセスできないかなと思ったのですが、
どうも、TEMPLATECOLUMN には配下のコントロールにアクセスできる
プロパティやメソッドはないようです。
まぁ、あくまでも実体を作るときのテンプレートですから
しょうがない気もしますが.....

今回、デザイナーでできることは基本的にデザイナーで実施することを
ルールで決めていて、そのルール内では、問題ないのですが、
デザイナーだとインテリセンスが効かないので、少々手間がかかります
で、コードビハインド側でできないかな? なんかいい方法ないかな?
と思った次第であります。

そういった意味では [CTRL]+[H] はいいかも (^^ゞ

ちなみに、テンプレートカラムで使用できる関数は、public か Protected でないとだめです(常識ですか? そうですか、気がつかなかった.......。)

もう一つ、日経BPソフトプレスからでている
.NETエンタープライズWebアプリケーション開発技術大全
はとても参考になります。
その中で、デザイナーとコードビハインド側での役割分担についても
さらっとふれているとことがあって、それに基づいたルールで開発を
進めています。

元来、コードでゴリゴリ書いていくのが好きなのですが、
結構、便利な機能がデザイナーにもあり、食わず嫌いもよくなかったな〜
と反省しきりです。(他にも定義済みDatasetとか便利すぎてもう手放せません!)

一緒になって考えてくださったみなさま、ありがとうございます。
今後ともよろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-02-28 18:42
> どうも、TEMPLATECOLUMN には配下のコントロールにアクセスできる
> プロパティやメソッドはないようです。
 いくつかスレッドがありますが、バインドイベントでコントロールを探します。まぁ、配列に入れるみたいなイメージで、定義済DataSetのようにクラスを作るイメージではありませんから、それくらいが限界かと。


> ちなみに、テンプレートカラムで使用できる関数は、public か
> Protected でないとだめです
 そうなんですよ。.aspxファイルは、クラスを継承しているので、継承先でアクセス可能でないとダメなんですよ。Web Matrixなどで、.aspx内にサーバコードも書いている場合、違うのかな?


> .NETエンタープライズWebアプリケーション開発技術大全
> はとても参考になります。
 私もやっと買ってきました(^o^;

_________________
1

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