次の方法で共有


データ バインド式の概要

更新 : 2007 年 11 月

データ バインディング構文によって、コントロールのプロパティ値をデータにバインドし、データの取得、更新、削除、および挿入のための値を指定できます。

データ バインディング構文

データ バインディング式は <%# デリミタと %> デリミタの間に記述され、Eval 関数と Bind 関数を使用します。Eval 関数は、一方向 (読み取り専用) バインディングを定義するために使用します。Bind 関数は、双方向 (更新可能) バインディングに使用します。Eval メソッドと Bind メソッドを呼び出してデータ バインディング式でデータ バインディングを実行することに加えて、<%# デリミタと %> デリミタの間でパブリックにスコープされた任意のコードを呼び出して実行し、ページの処理中に値を返すことができます。

データ バインディング式は、コントロールの DataBind メソッドまたは Page クラスが呼び出されたときに解決されます。GridViewDetailsViewFormView などのコントロールでは、データ バインディング式はコントロールの PreRender イベントの中で自動的に解決されるので、DataBind メソッドを明示的に呼び出す必要はありません。

ItemTemplateFormView コントロールと共にデータ バインディング式を使用するコード例を次に示します。

<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                   
</asp:FormView>
<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                 
</asp:FormView>

Eval メソッドの使用

Eval メソッドは、GridViewDetailsViewFormView などのデータ バインド コントロールのテンプレートの遅延バインディング データ式を評価します。Eval メソッドは、名前付けコンテナの現在のデータ項目を参照する DataBinder オブジェクトの Eval メソッドを実行時に呼び出します。名前付けコンテナは、GridView コントロールの行などのように、一般にレコード全体を含むデータ バインド コントロールの最小単位です。したがって、Eval メソッドは、データ バインド コントロールのテンプレート内のバインディングにのみ使用できます。

Eval メソッドはデータ フィールドの名前を受け取り、データ ソースの現在のレコードからそのフィールドの値を含む文字列を返します。2 番目のパラメータを指定して、返される文字列の形式を指定することもできます (省略可能)。文字列の書式指定パラメータは、String クラスの Format メソッドに対して定義された構文を使用します。

Bind メソッドの使用

Bind メソッドは、Eval メソッドに部分的に似ていますが、重要な違いがあります。Eval メソッドと同様に、Bind メソッドを使用してもデータ バインド フィールドの値を取得できますが、Bind メソッドはデータを変更できる場合にも使用します。

ASP.NET では、GridViewDetailsViewFormView などのデータ バインド コントロールは、データ ソース コントロールの更新、削除、および挿入操作を自動的に使用します。たとえば、データ ソース コントロールに対して SQL の Select、Insert、Delete、および Update ステートメントを定義している場合、GridViewDetailsView、または FormView コントロールのテンプレートで Bind を使用すると、そのコントロールで、テンプレートの子コントロールから値を抽出してデータ ソース コントロールに渡すことができます。次に、データ ソース コントロールは、データベースに対して適切なコマンドを実行します。そのために、データ バインド コントロールの EditItemTemplate または InsertItemTemplate の内部では Bind 関数が使用されます。

Bind メソッドは、編集モードの GridView 行によってレンダリングされた TextBox コントロールなどの入力コントロールで一般的に使用されます。データ バインド コントロールは、自身のレンダリング処理の一部としてこのような入力コントロールを作成する場合、入力値を抽出できます。

Bind メソッドは、次の例に示すように、データ フィールドの名前を受け取ってバインド プロパティに関連付けます。

ms178366.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

この例には、ユーザー入力を受け付けるテキスト ボックスがあるため、セキュリティ上の脅威になる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力にスクリプトまたは HTML 要素が含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。

<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
        &nbsp;
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

行の Update ボタンがクリックされると、Bind 構文を使用してバインドされた各コントロール プロパティの値が抽出され、更新操作のためにデータ ソース コントロールに渡されます。

DataBind メソッドの明示的な呼び出し

GridViewFormViewDetailsView などのコントロールは、DataSourceID プロパティを使用してデータ ソース コントロールにバインドされるときに DataBind メソッドを暗黙的に呼び出してバインディングを実行します。ただし、明示的に DataBind メソッドを呼び出す必要がある場合もあります。

そのような状況の 1 つは、DataSourceID プロパティの代わりに DataSource プロパティを使用してコントロールをデータ ソース コントロールにバインドした場合です。その場合は、明示的に DataBind メソッドを呼び出してデータ バインディングを実行し、データ バインディング式を解決する必要があります。

もう 1 つの状況は、データ バインド コントロールのデータを手動で更新する必要がある場合です。同じデータベースから情報を表示する 2 つのコントロールを含むページがあるとします。おそらく個別のビューを使用しています。この場合、データ表示の同期を維持するために明示的にデータにコントロールを再バインドする必要があります。たとえば、製品の一覧を表示する GridView コントロールおよびユーザーが製品を個々に編集するための DetailsView コントロールがあるとします。GridView コントロールと DetailsView コントロールは同じソースからデータを表示しますが、異なるクエリを使用してデータを取得しているので、別のデータ ソース コントロールにバインドされています。ユーザーが DetailsView コントロールを使用してレコードを更新すると、関連付けられているデータ ソース コントロールによって更新処理が実行されます。ただし、GridView コントロールは、別のデータ ソース コントロールにバインドされているので、ページが更新されるまで古いレコードの値が表示されます。そこで、DetailsView コントロールがデータを更新した後に、DataBind メソッドを呼び出します。これによって、<%# デリミタと %> デリミタの間のすべてのデータ バインディング式およびパブリックにスコープされたコードが再実行され、GridView コントロールのビューが更新されます。その結果、GridView コントロールに DetailsView コントロールによる更新内容が反映されます。

ルックアップ テーブルへのバインディングの使用

データ バインド コントロールは、ユーザーが DropDownList コントロールまたは他のリスト コントロールを使用し、ルックアップ テーブルから選択して値を更新または挿入できるようにする場合によく使用されます。この場合、ルックアップ コントロールは、可能な値の一覧を返す個別のデータ ソースにバインドされます。またルックアップ コントロールの選択した値は、親データ バインドの行のフィールドにバインドされます。

この機能は次の手順で追加できます。まず、ルックアップ コントロールについて、リスト コントロール (DropDownList コントロールまたは ListBox コントロール) をデータ バインド コントロール (GridViewDetailsViewFormView などの各コントロール) のテンプレートに追加します。ルックアップ コントロールの SelectedValue プロパティは、コンテナ コントロールのデータ ソースにある関連フィールドにバインドします。次に、ルックアップ コントロールの DataSourceID プロパティを、ルックアップ値を取得するデータ ソース コントロールに設定します。ルックアップ コントロールの DataTextField プロパティは、表示する値を含むルックアップ テーブルのフィールドに設定します。また、適用できる場合、DataValueField プロパティは、ルックアップ値の固有な識別子を含むルックアップ テーブルのフィールドに設定します。

次のコード例は、FormView コントロールの InsertItemTemplate テンプレートに含まれる DropDownList コントロールです (これは、DetailsView コントロールの Fields プロパティまたは GridView コントロールの Columns プロパティに含まれる、TemplateFieldInsertItemTemplate テンプレートの可能性もあります)。DropDownList コントロールの SelectedValue プロパティは、Bind メソッドを使用して、FormView コントロールの現在の行の CategoryID フィールドに双方向にバインディングします。DataSourceID コントロールの DropDownList プロパティは、可能なカテゴリ名と ID の一覧を取得する個別のデータ ソース コントロールに設定されます。DropDownList コントロールの DataTextField プロパティは、可能なカテゴリ名が表示されるように、ルックアップ データ ソースの CategoryName フィールドに設定されます。DropDownList コントロールの DataValueField プロパティは、関連するカテゴリ名のルックアップ データ ソースの CategoryID フィールドに設定されます。ユーザーがリストからカテゴリ名を選択すると、DropDownList コントロールの SelectedValue プロパティは、選択したカテゴリ名のカテゴリ ID に設定されます。

<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>
<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>

同じリスト コントロールを編集項目のテンプレートにも使用できます。

参照

処理手順

方法 : テンプレート コントロールにデータを連結する

概念

データベースへのバインド

ビジネス オブジェクトへのバインディング

階層データへのバインド

ASP.NET データ アクセスの概要