WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

Eval, Bind の正体

by WebSurfer 18. August 2010 16:17

データバインド式と 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フォームにおけるデータ連結 を参照してください。

Tags: ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  June 2021  >>
MoTuWeThFrSaSu
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar