方法 : テンプレート化されたデータ バインド コントロールで ASP.NET Dynamic Data を使用する

更新 : 2007 年 11 月

ASP.NET Dynamic Data は、ListViewFormViewRepeater などのテンプレートを使用するデータ バインド コントロールと共に使用できます。テンプレートを操作することにより、コントロール内のデータのレイアウトおよび外観を完全に制御できますが、テンプレートでは列を自動的に生成できないため、ページは使用するテーブルに固有のものです。これは、テンプレート化されたデータ バインド コントロールと Dynamic Data 機能を使用するカスタム ページを作成する場合に便利です。

テンプレート化されたデータ バインド コントロールを使用する場合は、テンプレートに DynamicControl コントロールを追加することで、Dynamic Data 機能を利用できるようになります。DynamicControl コントロールを使用すると、次の Dynamic Data 機能を活用できます。

DynamicControl コントロールは、テンプレート化されたデータ バインド コントロール内で使用されるだけでなく、GridView コントロールや DetailsView コントロールの TemplateField フィールドでも使用できます。

この機能のオンライン サンプルを実行してください。

データを表示する DynamicControl コントロールを追加するには

  1. データ バインド コントロールのテンプレートの 1 つに DynamicControl コントロールを追加します。

    Cc488554.alert_note(ja-jp,VS.90).gifメモ :

    テンプレート化されたコントロールの ItemTemplate テンプレートは、データを表示するためのものなので、通常、これには読み取り専用フィールドを追加します。ただし、フィールド値が変更されないようにする場合は、他のテンプレートに読み取り専用フィールドを追加することもできます。

  2. 次の例に示すように、表示する列の名前を DataField プロパティに設定します。

    <asp:DynamicControl 
      DataField="ProductName"
      runat="server" />
    
    Cc488554.alert_note(ja-jp,VS.90).gifメモ :

    Mode プロパティの既定値は ReadOnly です。したがって、データを表示するだけであれば、このプロパティを設定する必要はありません。

  3. 表示する各データ フィールドについて、前の手順を繰り返します。

編集操作の DynamicControl コントロールを追加するには

  1. データ バインド コントロールまたはテンプレート フィールドの EditItemTemplate テンプレートに、DynamicControl コントロールを追加します。

  2. DataField プロパティに、編集する列の名前を設定します。

  3. 次の例に示すように、Mode プロパティを Edit に設定します。

    <asp:DynamicControl 
      DataField="ProductName"
      Mode="Edit"
      runat="server" />
    
  4. 編集する各データ フィールドについて、前の手順を繰り返します。

挿入操作の DynamicControl コントロールを追加するには

  1. データ バインド コントロールまたはテンプレート フィールドの InsertItemTemplate テンプレートに、DynamicControl コントロールを追加します。

  2. DataField プロパティに、データを挿入する列の名前を設定します。

  3. 次の例に示すように、Mode プロパティを Insert に設定します。

    <asp:DynamicControl 
      DataField="ProductName"
      Mode="Insert"
      runat="server" />
    
  4. データを挿入する各データ フィールドについて、前の手順を繰り返します。

使用例

Dynamic Data 機能を利用するカスタム ページを作成するために DynamicControl コントロールを使用する FormView コントロールを次の例に示します。

<%@ Page Language="VB" %>

<script runat="server">

  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    DynamicDataManager1.RegisterControl(FormView1)
  End Sub

</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>DynamicControl and Templated Data-Bound Controls Sample</title>
  <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <div>

      <h2>Address Table</h2>

      <asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
        AutoLoadForeignKeys="true" />

      <asp:FormView ID="FormView1" runat="server" 
        DataSourceID="FormDataSource" 
        AllowPaging="true">
        <ItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="InsertButton" runat="server" CommandName="New" CausesValidation="false" Text="New" />
                <asp:LinkButton ID="EditButton" runat="server" CommandName="Edit" CausesValidation="false" Text="Edit" />
                <asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" CausesValidation="false" Text="Delete" />
              </td>
            </tr>
          </table>
        </ItemTemplate>
        <EditItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update">Update</asp:LinkButton>
                <asp:LinkButton ID="CancelEditButton" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
              </td>
            </tr>
          </table>
        </EditItemTemplate>
        <InsertItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" />
                <asp:LinkButton ID="CancelInsertButton" runat="server" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
              </td>
            </tr>
          </table>
        </InsertItemTemplate>
        <PagerSettings Position="Bottom" Mode="NumericFirstLast" />
      </asp:FormView>

      <!-- This example uses Microsoft SQL Server and connects   -->
      <!-- to the AdventureWorksLT sample database.              -->
      <asp:LinqDataSource ID="FormDataSource" runat="server"
        TableName="Addresses" 
        ContextTypeName="AdventureWorksLTDataContext"
        EnableDelete="true"
        EnableInsert="true"
        EnableUpdate="true">
      </asp:LinqDataSource>

    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>

<script runat="server">
    protected void Page_Init(object sender, EventArgs e) {
        DynamicDataManager1.RegisterControl(FormView1);
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>DynamicControl and Templated Data-Bound Controls Sample</title>
  <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <div>

      <h2>Address Table</h2>

      <asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
        AutoLoadForeignKeys="true" />

      <asp:FormView ID="FormView1" runat="server" 
        DataSourceID="FormDataSource" 
        AllowPaging="true">
        <ItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="InsertButton" runat="server" CommandName="New" CausesValidation="false" Text="New" />
                <asp:LinkButton ID="EditButton" runat="server" CommandName="Edit" CausesValidation="false" Text="Edit" />
                <asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" CausesValidation="false" Text="Delete" />
              </td>
            </tr>
          </table>
        </ItemTemplate>
        <EditItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" Mode="Edit" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update">Update</asp:LinkButton>
                <asp:LinkButton ID="CancelEditButton" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
              </td>
            </tr>
          </table>
        </EditItemTemplate>
        <InsertItemTemplate>
          <table>
            <tr>
              <td>Address Line 1:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine1" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Address Line 2:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="AddressLine2" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>City:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="City" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>State/Province:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="StateProvince" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Country:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="CountryRegion" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td>Postal Code:</td>
              <td>
                <asp:DynamicControl runat="server" DataField="PostalCode" Mode="Insert" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" />
                <asp:LinkButton ID="CancelInsertButton" runat="server" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
              </td>
            </tr>
          </table>
        </InsertItemTemplate>
        <PagerSettings Position="Bottom" Mode="NumericFirstLast" />
      </asp:FormView>

      <!-- This example uses Microsoft SQL Server and connects   -->
      <!-- to the AdventureWorksLT sample database.              -->
      <asp:LinqDataSource ID="FormDataSource" runat="server"
        TableName="Addresses" 
        ContextTypeName="AdventureWorksLTDataContext"
        EnableDelete="true"
        EnableInsert="true"
        EnableUpdate="true">
      </asp:LinqDataSource>

    </div>
  </form>
</body>
</html>

コードのコンパイル方法

この例で必要な要素は次のとおりです。

  • Dynamic Data Web サイトまたは Dynamic Data Web アプリケーション。

  • AdventureWorks または AdventureWorksLT サンプル データベース。SQL Server のサンプルをダウンロードしてインストールする方法については、CodePlex サイトの「Microsoft SQL Server Product Samples: Database」を参照してください。実行している SQL Server のバージョン (SQL Server 2005 または SQL Server 2008) に対応した正しいバージョンのサンプル データベースをインストールしてください。

  • AdventureWorks データベースまたは AdventureWorksLT データベースの Address テーブルにアクセスするように構成された LINQ to SQL クラス。

  • データ コンテキストが Global.asax ファイル内で Dynamic Data エンジンに登録されていること。

  • Address テーブルの rowguid 列および ModifiedData 列が、オブジェクト リレーショナル デザイナで自動生成されるように設定されていること。つまり、これら 2 つの列の IsDbGenerated プロパティが true に設定されていることを確認します。これは、挿入操作でのみ必要です。

堅牢性の高いプログラム

次の条件を満たす場合は、例外が発生する可能性があります。

  • データベースが使用できない場合

参照

概念

ASP.NET Dynamic Data の概要

ASP.NET Dynamic Data モデルの概要

参照

DynamicControl

DetailsView

FormView

GridView

ListView

Repeater