FormView のテンプレートの使用 (VB)

作成者: Scott Mitchell

PDF のダウンロード

DetailsView とは異なり、FormView はフィールドで構成されていません。 代わりに、FormView はテンプレートを使用してレンダリングされます。 このチュートリアルでは、FormView コントロールを使用して、より固定度の低いデータ表示を行う方法について説明します。

はじめに

前の 2 つのチュートリアルでは、TemplateField を使用して GridView および DetailsView コントロールの出力をカスタマイズする方法について説明しました。 TemplateField を使用すると、特定のフィールドの内容を高度にカスタマイズできますが、最終的には GridView と DetailsView の両方が、グリッドのようなボックス型の外観になります。 多くのシナリオでは、このようなグリッドに似たレイアウトが理想的ですが、より流動的で固定度の低い表示が必要になります。 1 つのレコードを表示する場合は、FormView コントロールを使用してこのような流動レイアウトが可能です。

DetailsView とは異なり、FormView はフィールドで構成されていません。 BoundField または TemplateField を FormView に追加することはできません。 代わりに、FormView はテンプレートを使用してレンダリングされます。 FormView は、1 つの TemplateField を含む DetailsView コントロールと考えてください。 FormView は、次のテンプレートをサポートしています。

  • ItemTemplate: FormView に表示される特定のレコードをレンダリングするために使用される
  • HeaderTemplate: 省略可能なヘッダー行を指定するために使用される
  • FooterTemplate: 省略可能なフッター行を指定するために使用される
  • EmptyDataTemplate: FormView の DataSource にレコードがない場合は、コントロールのマークアップをレンダリングするために ItemTemplate の代わりに EmptyDataTemplate が使用される
  • PagerTemplate: ページングが有効になっている FormView のページング インターフェイスをカスタマイズするために使用できる
  • EditItemTemplate / InsertItemTemplate: FormView の編集インターフェイスまたは挿入インターフェイスをカスタマイズするために使用される (そのような機能がサポートされる場合)

このチュートリアルでは、FormView コントロールを使用して、より固定度の低い製品表示を行う方法について説明します。 FormView の ItemTemplate は、名前、カテゴリ、仕入先などのフィールドを使用する代わりに、ヘッダー要素と <table> の組み合わせを使用してこれらの値を表示します (図 1 を参照)。

The FormView Breaks Out of the Grid-Like Layout Seen in the DetailsView

図 1: DetailsView に表示されるグリッドに似たレイアウトから脱却した FormView (クリックするとフルサイズの画像が表示されます)

ステップ 1: データを FormView にバインドする

FormView.aspx ページを開き、FormView をツールボックスからデザイナーにドラッグします。 FormView を初めて追加したときは、灰色のボックスとして表示され、ItemTemplate が必要であることが示されます。

The FormView Cannot be Rendered in the Designer Until an ItemTemplate is Provided

図 2: FormView は、ItemTemplate が提供されるまでデザイナーでレンダリングできない (クリックするとフルサイズの画像が表示されます)

ItemTemplate は、手動で (宣言構文を使用して) 作成することも、デザイナーを使用して FormView をデータ ソース コントロールにバインドすることにより自動作成することもできます。 この自動作成された ItemTemplate には、各フィールドの名前を一覧表示する HTML と、フィールドの値にバインドされた Text プロパティを持つ Label コントロールが含まれています。 この方法では InsertItemTemplateEditItemTemplate も自動作成され、どちらも、データ ソース コントロールによって返される各データ フィールドの入力コントロールが設定されます。

テンプレートを自動作成する場合は、FormView のスマート タグから、ProductsBLL クラスの GetProducts() メソッドを呼び出す新しい ObjectDataSource コントロールを追加します。 これにより、ItemTemplateInsertItemTemplateEditItemTemplate を使用して FormView が作成されます。 編集または挿入をサポートする FormView の作成にはまだ関心がないため、ソース ビューから InsertItemTemplateEditItemTemplate を削除します。 次に、作業するクリーン スレートが作成されるように、ItemTemplate 内のマークアップをクリアします。

ItemTemplate を手動でビルドする場合は、ツールボックスからデザイナーに ObjectDataSource をドラッグして追加および構成できます。 ただし、デザイナーから FormView のデータ ソースを設定しないでください。 代わりに、ソース ビューに移動し、FormView の DataSourceID プロパティを ObjectDataSource の ID 値に手動で設定します。 次に、手動で ItemTemplate を追加します。

どの方法を採用するかに関係なく、この時点で FormView の宣言型マークアップは次のようになります。

<asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource1">
    <ItemTemplate>

    </ItemTemplate>
</asp:FormView>

FormView のスマート タグの [ページングを有効にする] チェック ボックスをオンにします。これにより、FormView の宣言構文に AllowPaging="True" 属性が追加されます。 また、EnableViewState プロパティを False に設定します。

ステップ 2: ItemTemplate のマークアップを定義する

FormView を ObjectDataSource コントロールにバインドし、ページングをサポートするように構成すると、ItemTemplate の内容を指定する準備ができます。 このチュートリアルでは、製品の名前を <h3> 見出しに表示します。 その後、HTML <table> を使用して、4 列のテーブルに残りの製品プロパティを表示します。1 列目と 3 列目にはプロパティ名が一覧表示され、2 列目と 4 列目にはその値が一覧表示されます。

このマークアップは、デザイナーで FormView のテンプレート編集インターフェイスを使用して入力することも、宣言構文を使用して手動で入力することもできます。 テンプレートを使用する場合、通常は宣言構文を直接操作する方が速いのですが、自分が最も使いやすい手法を自由に使用できます。

次のマークアップは、ItemTemplate の構造体が完成した後の FormView 宣言型マークアップを示しています。

<asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource1"
    AllowPaging="True" EnableViewState="False">
    <ItemTemplate>
        <hr />
        <h3><%# Eval("ProductName") %></h3>
        <table border="0">
            <tr>
                <td class="ProductPropertyLabel">Category:</td>
                <td class="ProductPropertyValue">
                  <%# Eval("CategoryName") %></td>
                <td class="ProductPropertyLabel">Supplier:</td>
                <td class="ProductPropertyValue">
                  <%# Eval("SupplierName")%></td>
            </tr>
            <tr>
                <td class="ProductPropertyLabel">Price:</td>
                <td class="ProductPropertyValue"><%# Eval("UnitPrice",
                  "{0:C}") %></td>
                <td class="ProductPropertyLabel">Units In Stock:</td>
                <td class="ProductPropertyValue">
                  <%# Eval("UnitsInStock")%></td>
            </tr>
            <tr>
                <td class="ProductPropertyLabel">Units On Order:</td>
                <td class="ProductPropertyValue">
                  <%# Eval("UnitsOnOrder") %></td>
                <td class="ProductPropertyLabel">Reorder Level:</td>
                <td class="ProductPropertyValue">
                  <%# Eval("ReorderLevel")%></td>
            </tr>
            <tr>
                <td class="ProductPropertyLabel">Qty/Unit</td>
                <td class="ProductPropertyValue">
                  <%# Eval("QuantityPerUnit") %></td>
                <td class="ProductPropertyLabel">Discontinued:</td>
                <td class="ProductPropertyValue">
                    <asp:CheckBox runat="server" Enabled="false"
                      Checked='<%# Eval("Discontinued") %>' />
                </td>
            </tr>
        </table>
        <hr />
    </ItemTemplate>
</asp:FormView>

たとえば、データ バインド構文 <%# Eval("ProductName") %> は、テンプレートの出力に直接挿入できることに注意してください。 つまり、ラベル コントロールの Text プロパティに割り当てる必要はありません。 たとえば、<h3><%# Eval("ProductName") %></h3> を使用して <h3> 要素に ProductName 値を表示しています。製品 Chai は <h3>Chai</h3> としてレンダリングされます。

ProductPropertyLabel および ProductPropertyValue CSS クラスは、製品プロパティの名前と値のスタイルを指定するために <table> 内で使用されます。 これらの CSS クラスが Styles.css で定義され、プロパティ名は太字で右揃えになり、プロパティ値に右パディングが追加されます。

FormView で使用できる CheckBoxField がないため、Discontinued 値をチェックボックスとして表示するには、独自の CheckBox コントロールを追加する必要があります。 Enabled プロパティは False に設定され、読み取り専用になり、CheckBox の Checked プロパティは Discontinued データ フィールドの値にバインドされます。

ItemTemplate が完成すると、製品情報ははるかに流動的に表示されます。 前のチュートリアルの DetailsView 出力 (図 3) と、このチュートリアルの FormView によって生成された出力 (図 4) を比較します。

The Rigid DetailsView Output

図 3: 固定的な DetailsView 出力 (クリックするとフルサイズの画像が表示されます)

The Fluid FormView Output

図 4: 流動的な FormView 出力 (クリックするとフルサイズの画像が表示されます)

まとめ

GridView および DetailsView コントロールは TemplateField を使用して出力をカスタマイズできますが、両方ともグリッドのようなボックス形式でデータを表示します。 1 つのレコードを固定度の低いレイアウトで表示する必要がある場合は、FormView が理想的な選択肢です。 DetailsView と同様に、FormView はその DataSource から 1 つのレコードをレンダリングしますが、DetailsView とは異なり、テンプレートだけで構成され、フィールドはサポートしません。

このチュートリアルで説明したように、FormView を使用すると、1 つのレコードを表示するときに、より柔軟なレイアウトが可能になります。 今後のチュートリアルでは、FormsView と同じレベルの柔軟性を提供するが (GridView のように) 複数のレコードを表示できる DataList および Repeater コントロールを調べます。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジに取り組んでいます。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は E.R.Gilmore でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。