データバインド式と Eval メソッドの話が出てきたので、ついでに Eval, Bind メソッドとは一体何かについて調べたことを書いておきます。
前に書いたことのおさらいですが、データバインド式は <%# デリミタと %> デリミタの間に記述され、Eval メソッドと Bind メソッドを使用します。
Eval メソッドは、一方向 (読み取り専用) バインディングを定義するために使用します。Bind メソッドは、双方向 (更新可能) バインディングに使用します。
Eval メソッド
以下は、MSDN ライブラリの「データ バインド式の概要」からの抜粋です。
"Eval メソッドは、名前付けコンテナの現在のデータ項目を参照する DataBinder オブジェクトの Eval メソッドを実行時に呼び出します。"
上記を、自分の理解(独断と偏見?)に基づき、具体的に書いてみます。
例えば以下のように、GirdView の ItemTemplate に配置した Label の Text プロパティにデータバインド式が設定してあったとします。
Text='<%# Eval("Price") %>'
これは DataBinder.Eval 静的メソッドを以下のように呼び出します。
Text='<%# DataBinder.Eval(Container.DataItem, "Price") %>'
第 1 引数に使われている Container は ASP.NET によって自動的に定義され初期化されます。使用されているデータバインドコントロールによって異なりますが、たとえば GridView を使用した場合、Container は GridViewRow になります(詳細後述)。
第 2 引数は、第 1 引数の Container.DataItem オブジェクトから値を取得するプロパティ名またはインデクサ名の文字列となります。例えば、DictionaryEntry.Key の Key などのプロパティ名、または DataRowView["Price"] の Price などのインデクサ名から成る文字列である必要があります。(2010/8/20 一部修正)
DataBinder.Eval メソッドは、第 1 引数で指定したオブジェクトに対して、第 2 引数で指定した名前を持つプロパティの値またはインデクサが指す値を取得して、Object 型として返します。先の DictionaryEntry および DataRowView を例にとると、下記のようになります。(2010/8/20 一部修正)
((DictionaryEntry)Container.DataItem).Key
((DataRowView)Container.DataItem)["Price"]
Eval メソッドで、プログラマが明示的にキャストを書かなくてもよいのはリフレクション機能を利用しているからだそうです。
Bind メソッド
DataBinder クラスには Bind というメソッドはありません。Bind メソッドの詳細が書いてあるドキュメントも見つかりませんでしたが、以下の点以外は Eval と同じと思われます。
GridView、DetailsView、FormView などのデータバインドコントロールのテンプレートに配置した TextBox や CheckBox で Bind を使用すると、それらへの入力値を抽出して、編集モードでは NewValues コレクション経由、挿入モードでは Values コレクション経由で、データソースコントロール(SqlDataSource など)に渡すことができます。
Container.DataItem
DataBinder.Evalメソッドの第 1 引数のオブジェクト Container.DataItem とは何でしょう?
例えばデータバインドコントロールに GridView を使用すると、ASP.NET が自動生成するコードで Container は以下のように定義され、自動的に初期化されるようになっています。
GridViewRow Container;
その他、Repeater, DataGrid, DataList, DetailsView, FormView, ListView などのデータバインドコントロールを用いると、適宜 RepeaterItem, DataGridItem, DataListItem, DetailsView, FormView, ListViewDataItem などが Container として定義され、初期化されるようになっています。
詳しくは、@IT のサイトの Container.DataItemの正体は? を参照してください。
------------ 2010/8/20 追記 ------------
DataBinder.Eval メソッドの第 2 引数は、MSDN ライブラリには "プロパティ名またはフィールド名から成る文字列" と書いてありましたが、インデクサの場合もありますので修正しました。
@IT のサイトの Webフォームにおけるデータ連結 を参照してください。