著者: Walkdan (walkdan(at)gmail.com)
ASP.NET 2.0 の Eval() は、次のように ASP 1.1 Container.DataItem を簡素化します。
<%# (Container.DataItem as DataRowView)["ProductName"].ToString( ) %>
は次のように簡略化されます (ASP 1.1 では型指定が削除され、Eval はリフレクションを通じて実装されますが、この記事では説明しません)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %> は
次のように簡略化されます (ASP 2.0)。
<%# Eval("製品名") %>
Eval() は TemplateControl:Page のメソッドです
TemplateControl.Eval() はコンテナを自動的に計算でき、dataBindingContext:Stack スタックからコンテナを取得する仕組みです。
1. DataItem コンテナ スタックを作成します。
Control.DataBind() でこれを確立して、子コントロールの DataItem コンテナが常にスタックの最上位にあるようにします。
パブリッククラスコントロール
{
protected virtual void DataBind(bool raiseOnDataBinding)
{
bool foundDataItem = false;
if (this.IsBindingContainer)
{
オブジェクト o = DataBinder.GetDataItem(this, out foundDataItem);
if(見つかったデータ項目)
Page.PushDataItemContext(o); <-- DataItem をスタックにプッシュします
}
試す
{
if (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- 子コントロールをバインドします
}
ついに
{
if(見つかったデータ項目)
Page.PopDataItemContext() <-- DataItem をスタックからポップします。
}
}
2.
DataItemコンテナの取得
パブリッククラスページ
{
パブリック オブジェクト GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- スタックの最上位にある DataItem コンテナ (バインドされている DataItem コンテナ) を読み取ります。
}
}
3. TemplateContro.Eval()
パブリック クラス TemplateControl
{
protected string Eval (文字列式、文字列形式)
{
return DataBinder.Eval (Page.GetDataItem()、式、形式);
}
}