データ変更インターフェイスをカスタマイズする (C#)

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、標準の TextBox コントロールと CheckBox コントロールを代替の入力 Web コントロールに置き換えて、編集可能な GridView のインターフェイスをカスタマイズする方法について説明します。

はじめに

GridView コントロールと DetailsView コントロールで使用される BoundField および CheckBoxField は、読み取り専用、編集可能、挿入可能なインターフェイスをレンダリングできるため、データを変更するプロセスを簡略化します。 これらのインターフェイスは、追加の宣言型マークアップまたはコードを追加する必要なくレンダリングできます。 ただし、BoundField と CheckBoxField のインターフェイスには、実際のシナリオで頻繁に必要になるカスタマイズ性がありません。 GridView または DetailsView で編集可能または挿入可能なインターフェイスをカスタマイズするには、代わりに TemplateField を使用する必要があります。

前のチュートリアルでは、検証 Web コントロールを追加してデータ変更インターフェイスをカスタマイズする方法について説明しました。 このチュートリアルでは、BoundField と CheckBoxField の標準 TextBox コントロールと CheckBox コントロールを代替の入力 Web コントロールに置き換えて、実際のデータ収集 Web コントロールをカスタマイズする方法について説明します。 特に、編集可能な GridView を構築して、製品の名前、カテゴリ、サプライヤー、廃止済みの状態を更新できるようにします。 特定の行を編集すると、カテゴリ フィールドとサプライヤー フィールドは、選択可能なカテゴリとサプライヤーのセットが含まれる DropDownList としてレンダリングされます。 さらに、CheckBoxField の既定の CheckBox を、"Active" と "Discontinued" の 2 つのオプションを提供する RadioButtonList コントロールに置き換えます。

GridView の編集インターフェイスには、DropDownLists と RadioButton が含まれています

図 1: GridView の編集インターフェイスに DropDownList と RadioButton が含まれている (クリックするとフルサイズの画像が表示されます)

手順 1: 適切な UpdateProduct オーバーロードの作成

このチュートリアルでは、製品名、カテゴリ、サプライヤー、廃止済みの状態の編集を許可する編集可能な GridView を構築します。 したがって、これらの 4 つの積の値に ProductID を加えた 5 つの入力パラメーターを受け入れる UpdateProduct オーバーロードが必要です。 前のオーバーロードと同様に、これは次の処理を実行します。

  1. データベースから指定した ProductID の製品情報を取得します。
  2. ProductNameCategoryIDSupplierIDDiscontinued の各フィールドを更新します。
  3. TableAdapter の Update() メソッドを使用して DAL に更新要求を送信します。

簡潔にするために、この特定のオーバーロードのために、廃止としてマークされている製品がそのサプライヤーによって提供される唯一の製品ではないことを確認するための、ビジネス ルール チェックを省略しました。 必要に応じて自由に追加できます。または、ロジックを別のメソッドにリファクターするのが理想的です。

次のコードは、UpdateProduct クラスの新しい ProductsBLL オーバーロードを示しています。

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, int? categoryID,
    int? supplierID, bool discontinued, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (supplierID == null) product.SetSupplierIDNull();
      else product.SupplierID = supplierID.Value;
    if (categoryID == null) product.SetCategoryIDNull();
      else product.CategoryID = categoryID.Value;
    product.Discontinued = discontinued;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

手順 2: 編集可能な GridView の作成

UpdateProduct オーバーロードが追加されたので、編集可能な GridView を作成する準備ができました。 EditInsertDelete フォルダー内の CustomizedUI.aspx ページを開き、GridView コントロールをデザイナーに追加します。 次に、GridView のスマート タグから新しい ObjectDataSource を作成します。 ProductBLL クラスの GetProducts() メソッドを使用して製品情報を取得し、先ほど作成した UpdateProduct オーバーロードを使用して製品データを更新するように ObjectDataSource を構成します。 [挿入] タブと [削除] タブで、ドロップダウン リストから [(なし)] を選択します。

作成した UpdateProduct オーバーロードを使用するように ObjectDataSource を構成する

図 2: 作成した UpdateProduct オーバーロードを使用するように ObjectDataSource を構成する (クリックするとフルサイズの画像が表示されます)

データ変更のチュートリアルで説明したように、Visual Studio によって作成された ObjectDataSource の宣言構文では、OldValuesParameterFormatString プロパティに original_{0} が割り当てられます。 もちろん、このメソッドでは元の ProductID 値が渡されるとは想定されないため、これはビジネス ロジック層では機能しません。 したがって、前のチュートリアルで行ったように、このプロパティの割り当てを宣言構文から削除するか、代わりにこのプロパティの値を {0} に設定します。

この変更後、ObjectDataSource の宣言型マークアップは次のようになるはずです。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProducts" TypeName="ProductsBLL"
    UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

OldValuesParameterFormatString プロパティが削除されていること、および UpdateProduct オーバーロードで予期される各入力パラメーターの UpdateParameters コレクションに Parameter が存在する点に注意してください。

ObjectDataSource は製品値のサブセットのみを更新するように構成されていますが、現在、GridView にはすべての製品フィールドが表示されます。 ここで、次のように GridView を編集します。

  • ProductNameSupplierNameCategoryName の BoundField と Discontinued の CheckBoxField のみが含まれます
  • CategoryName フィールドと SupplierName フィールドが Discontinued CheckBoxField の前 (左側) に表示されます
  • CategoryName および SupplierName の BoundField の HeaderText プロパティが、それぞれ "Category" と "Supplier" に設定されます
  • 編集のサポートが有効になっています (GridView のスマート タグの [編集を有効にする] チェック ボックスをオンにします)

これらの変更後、デザイナーは図 3 のようになります。GridView の宣言構文を次に示します。

GridView から不要なフィールドを削除する

図 3: GridView から不要なフィールドを削除する (クリックするとフルサイズの画像が表示されます)

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductName"
           HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
           ReadOnly="True"
           SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
           ReadOnly="True"
           SortExpression="SupplierName" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

この時点で、GridView の読み取り専用動作は完了です。 データを表示すると、各製品が GridView の行としてレンダリングされ、製品の名前、カテゴリ、サプライヤー、廃止済みの状態が表示されます。

GridView の読み取り専用インターフェイスが完了しました

図 4: GridView の読み取り専用インターフェイスが完了した (クリックするとフルサイズの画像が表示されます)

Note

データの挿入、更新、削除の概要のチュートリアルで説明したように、GridView のビュー状態を有効にする (既定の動作) ことが非常に重要です。 GridView の EnableViewState プロパティを false に設定すると、同時実行ユーザーが意図せずにレコードを削除または編集するリスクが発生します。

手順 3: カテゴリおよびサプライヤー編集インターフェイスへの DropDownList の使用

ProductsRow オブジェクトには、CategoryIDCategoryNameSupplierIDSupplierName プロパティが含まれていることを思い出してください。これらのプロパティは、Products データベース テーブル内の実際の外部キー ID 値と、Categories テーブルと Suppliers テーブル内の対応する Name 値を提供します。 ProductRowCategoryIDSupplierID は読み取りと書き込みの両方が可能ですが、CategoryName プロパティと SupplierName プロパティは読み取り専用としてマークされます。

CategoryName プロパティと SupplierName プロパティの読み取り専用の状態により、対応する BoundField の ReadOnly プロパティが true に設定されているため、行の編集時にこれらの値が変更されなくなります。 ReadOnly プロパティを false に設定して、編集中に CategoryName BoundField と SupplierName BoundField を TextBox としてレンダリングできますが、このような方法では、CategoryNameSupplierName の入力を取り込むための UpdateProduct オーバーロードがないため、ユーザーが製品を更新しようとすると例外が発生します。 実際には、次の 2 つの理由でこのようなオーバーロードは作成しません。

  • Products テーブルには SupplierName フィールドまたは CategoryName フィールドはありませんが、SupplierIDCategoryID があります。 そのため、メソッドに参照テーブルの値ではなく、これらの特定の ID 値を渡す必要があります。
  • ユーザーが利用可能なカテゴリとサプライヤーと、それらの正しいスペルを知っている必要があるため、ユーザーにサプライヤーまたはカテゴリの名前の入力を求めるのは理想的ではありません。

サプライヤーとカテゴリのフィールドには、読み取り専用モードの場合はカテゴリとサプライヤーの名前が表示され、編集時には適用可能なオプションが含まれるドロップダウン リストが表示されるようにします。 ドロップダウン リストを使用すると、エンド ユーザーは、どのカテゴリやサプライヤーを選択できるかをすばやく確認でき、より簡単に選択できます。

この動作を提供するには、SupplierName および CategoryName の BoundField を TemplateField に変換する必要があります。この ItemTemplate は、SupplierNameCategoryName の値を生成し、その EditItemTemplate は DropDownList コントロールを使用して使用可能なカテゴリとサプライヤーを一覧表示します。

Categories および Suppliers の DropDownList の追加

まず、SupplierNameCategoryName の BoundField を TemplateField に変換します。これには、GridView のスマート タグから [列の編集] リンクをクリックし、左下の一覧から BoundField を選択し、[このフィールドを TemplateField に変換します] リンクをクリックします。 変換プロセスによって、次の宣言構文に示すように、ItemTemplateEditItemTemplate の両方を含む TemplateField が作成されます。

<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
    <EditItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Eval("CategoryName") %>'></asp:Label>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("CategoryName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

BoundField は読み取り専用としてマークされているため、ItemTemplateEditItemTemplate の両方に、Text プロパティが該当するデータ フィールド (上記の構文では CategoryName) にバインドされているラベル Web コントロールが含まれています。 ラベル Web コントロールを DropDownList コントロールに置き換えて、EditItemTemplate を変更する必要があります。

前のチュートリアルで説明したように、テンプレートはデザイナーを使用して編集することも、宣言構文から直接編集することもできます。 デザイナーを使用して編集するには、GridView のスマート タグから [テンプレートの編集] リンクをクリックし、カテゴリ フィールドの EditItemTemplate を使用するように選択します。 ラベル Web コントロールを削除し、DropDownList コントロールに置き換え、DropDownList の ID プロパティを Categories に設定します。

TexBox を削除し、EditItemTemplate に DropDownList を追加する

図 5: TexBox を削除して DropDownList を EditItemTemplate に追加する (クリックするとフルサイズの画像が表示されます)

次に、DropDownList に使用可能なカテゴリを設定する必要があります。 DropDownList のスマート タグから [データ ソースの選択] リンクをクリックし、CategoriesDataSource という名前の新しい ObjectDataSource を作成することを選択します。

CategoriesDataSource という名前の新しい ObjectDataSource コントロールを作成する

図 6: CategoriesDataSource という名前の新しい ObjectDataSource コントロールを作成する (クリックするとフルサイズの画像が表示されます)

この ObjectDataSource がすべてのカテゴリを返すようにするには、CategoriesBLL クラスの GetCategories() メソッドにバインドします。

ObjectDataSource を CategoriesBLL の GetCategories() メソッドにバインドする

図 7: ObjectDataSource を CategoriesBLLGetCategories() メソッドにバインドする (クリックするとフルサイズの画像が表示されます)

最後に、値として使用される CategoryID フィールドを使用して各 DropDownList ListItemCategoryName フィールドが表示されるように、DropDownList の設定を構成します。

CategoryName フィールドを表示し、CategoryID を値として使用する

図 8: CategoryName フィールドを表示し、CategoryID を値として使用する (クリックするとフルサイズの画像が表示されます)

これらの変更を行った後、CategoryName TemplateField の EditItemTemplate の宣言型マークアップには、DropDownList と ObjectDataSource の両方が含まれます。

<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
    <EditItemTemplate>
        <asp:DropDownList ID="Categories" runat="server"
          DataSourceID="CategoriesDataSource"
          DataTextField="CategoryName" DataValueField="CategoryID">
        </asp:DropDownList>
        <asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
            OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetCategories" TypeName="CategoriesBLL">
        </asp:ObjectDataSource>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("CategoryName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Note

EditItemTemplate の DropDownList のビュー状態が有効になっている必要があります。 間もなく、DropDownList の宣言構文にデータ バインド構文が追加されるため、Eval()Bind() などのデータ バインド コマンドは、ビュー状態が有効になっているコントロールにのみ表示できます。

次の手順を繰り返して、Suppliers という名前の DropDownList を SupplierName TemplateField の EditItemTemplate に追加します。 これには、DropDownList を EditItemTemplate に追加して別の ObjectDataSource を作成する必要があります。 ただし、Suppliers DropDownList の ObjectDataSource は、SuppliersBLL クラスの GetSuppliers() メソッドを呼び出すように構成する必要があります。 さらに、CompanyName フィールドを表示し、SupplierID フィールドをその ListItem の値として使用するように、Suppliers DropDownList を構成します。

2 つの EditItemTemplate に DropDownList を追加した後、ブラウザーでページを読み込み、Chef Anton's Cajun Seasoning 製品の [編集] ボタンをクリックします。 図 9 に示すように、製品のカテゴリとサプライヤーの列は、選択可能なカテゴリとサプライヤーを含むドロップダウン リストとしてレンダリングされます。 ただし、ただし、Chef Anton's Cajun Seasoning は、New Orleans Cajun Delights が提供する Condiment ですが、既定では、両方のドロップダウン リストで最初の項目 (カテゴリが Beverages でサプライヤーが Exotic Liquids) が選択されていることに注意してください。

ドロップダウン リストの最初の項目が既定で選択されている

図 9: ドロップダウン リストの最初の項目が既定で選択されている (クリックするとフルサイズの画像が表示されます)

さらに、[更新] をクリックすると、製品の CategoryIDSupplierID の値が NULL に設定されていることがわかります。 これらの望ましくない動作はどちらも、EditItemTemplate の DropDownList が基になる製品データのデータ フィールドにバインドされていないために発生します。

DropDownList の CategoryID および SupplierID データ フィールドへのバインド

編集した製品のカテゴリとサプライヤーのドロップダウン リストを適切な値に設定し、[更新] をクリックしたときにこれらの値を BLL の UpdateProduct メソッドに戻すには、双方向データ バインドを使用して DropDownList の SelectedValue プロパティを CategoryID および SupplierID のデータ フィールドにバインドする必要があります。 Categories DropDownList を使用してこれを実現するには、宣言構文に SelectedValue='<%# Bind("CategoryID") %>' 直接追加できます。

または、デザイナーでテンプレートを編集し、DropDownList のスマート タグから [DataBindings の編集] リンクをクリックして、DropDownList のデータ バインドを設定することもできます。 次に、双方向データ バインドを使用して、SelectedValue プロパティを CategoryID フィールドにバインドする必要があることを示します (図 10 を参照)。 宣言型またはデザイナー プロセスを繰り返して、SupplierID データ フィールドを Suppliers DropDownList にバインドします。

双方向データ バインドを使用して、CategoryID を DropDownList の SelectedValue プロパティにバインドする

図 10: 双方向データ バインドを使用して CategoryID を DropDownList の SelectedValue プロパティにバインドする (クリックするとフルサイズの画像が表示されます)

2 つの DropDownList の SelectedValue プロパティにバインドが適用されると、編集された製品のカテゴリとサプライヤーの列は、既定で現在の製品の値になります。 [更新] をクリックすると、選択したドロップダウン リスト項目の CategoryIDSupplierID の値が UpdateProduct メソッドに渡されます。 図 11 は、データバインディング ステートメントが追加された後のチュートリアルを示しています。Chef Anton's Cajun Seasoning が選択されたドロップダウンリスト項目が、正しく Condiment と New Orleans Cajun Delights になっていることに注意してください。

既定では、編集済み製品の現在のカテゴリと仕入先の値が選択されています

図 11: 編集された製品の現在のカテゴリとサプライヤーの値が既定で選択されている (クリックするとフルサイズの画像が表示されます)

NULL 値の処理

Products テーブル内の CategoryID 列と SupplierID 列は NULL にできますが、EditItemTemplate の DropDownList には NULL 値を表すリスト項目は含まれません。 これにより次の 2 つの結果が生じます。

  • ユーザーは、このインターフェイスを使用して製品のカテゴリまたはサプライヤーを NULL 以外の値から NULL 値に変更することはできません
  • 製品に NULL CategoryID または SupplierIDがある場合、[編集] ボタンをクリックすると例外が発生します。 これは、Bind() ステートメント内の CategoryID (または SupplierID) によって返される NULL 値が、DropDownList の値にマップされないためです (その SelectedValue プロパティがリスト項目のコレクションにない値に設定されている場合、DropDownList は例外をスローします)。

NULL CategoryID値とSupplierID値をサポートするには、NULL値を表す別のListItemを各 DropDownList に追加する必要があります。 DropDownList を使用したマスター/詳細のフィルター処理に関するチュートリアルでは、データバインドされた DropDownList に ListItem を追加する方法について説明しました。このチュートリアルでは、DropDownList の AppendDataBoundItems プロパティを true に設定し、ListItem を手動で追加する方法について説明しました。 しかし、前のチュートリアルでは、ListItemValue -1 で追加しました。 ただし、ASP.NET のデータバインド ロジックでは、空白の文字列が自動的に NULL 値に変換され、その逆が行われます。 したがって、このチュートリアルでは、ListItemValue を空の文字列にします。

最初に、両方の DropDownList の AppendDataBoundItems プロパティを true に設定します。 次に、宣言型マークアップが次のように見えるように、各 DropDownList に次の<asp:ListItem>要素を追加して、NULL ListItemを追加します。

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">(None)</asp:ListItem>
</asp:DropDownList>

ここでは、ListItem のテキスト値として "(None)" を使用することを選択しましたが、必要に応じて空白の文字列に変更することもできます。

Note

DropDownList を使用したマスター/詳細のフィルター処理に関するチュートリアルで説明したように、[プロパティ] ウィンドウで DropDownList の Items プロパティをクリックすると (ListItem コレクション エディターが表示されます)、デザイナーから ListItem を DropDownList に追加できます。 ただし、宣言構文を使用して、このチュートリアルの NULL ListItem を必ず追加してください。 ListItem コレクション エディターを使用する場合、生成された宣言構文では、空の文字列が割り当てられたときに Value 設定が完全に省略され、<asp:ListItem>(None)</asp:ListItem> のような宣言型マークアップが作成されます。 これは無害に見えるかもしれませんが、不足している値により、DropDownList はその代わりに Text プロパティ値を使用します。 つまり、この NULL ListItem を選択すると、値 "(None)" が CategoryIDに割り当てられ、例外が発生します。 Value=""を明示的に設定すると、NULL ListItemが選択されたときにNULL値がCategoryIDに割り当てられます。

サプライヤー DropDownList に対してこれらの手順を繰り返します。

この ListItem の追加により、図 12 に示すように、編集インターフェイスで製品の NULLCategoryID フィールドに SupplierID 値を割り当てることができるようになりました。

製品のカテゴリまたは仕入先に NULL 値を割り当てるには、(なし) を選択します

図 12: 製品のカテゴリまたはサプライヤーに NULL 値を割り当てるために (None) を選択する (クリックするとフルサイズの画像が表示されます)

手順 4: 廃止済みの状態への RadioButton の使用

現在、製品の Discontinued データ フィールドは CheckBoxField を使用して表され、読み取り専用行には無効なチェック ボックスがレンダリングされ、編集中の行には有効なチェック ボックスがレンダリングされます。 多くの場合、このユーザー インターフェイスは適切ですが、必要に応じて TemplateField を使用してカスタマイズできます。 このチュートリアルでは、CheckBoxField を、ユーザーが製品の Discontinued 値を指定できる 2 つのオプション "Active" と "Discontinued" を持つ RadioButtonList コントロールを使用する TemplateField に変更します。

まず、Discontinued CheckBoxField を TemplateField に変換します。これにより、ItemTemplateEditItemTemplate を持つ TemplateField が作成されます。 どちらのテンプレートにも、Discontinued データ フィールドにバインドされた Checked プロパティを持つ CheckBox が含まれています。2 つの唯一の違いは、ItemTemplate の CheckBox の Enabled プロパティが false に設定されていることです。

ItemTemplateEditItemTemplate の両方の CheckBox を RadioButtonList コントロールに置き換え、両方の RadioButtonList の ID プロパティを DiscontinuedChoice に設定します。 次に、RadioButtonList にそれぞれ 2 つのラジオ ボタンが含まれている必要があることを示します。1 つは "Active" というラベルで値が "False" で、もう 1 つは "Discontinued" というラベルで値が "True" です。 これを実現するには、宣言構文を使用して <asp:ListItem> 要素を直接入力するか、デザイナーから ListItem コレクション エディターを使用します。 図 13 は、2 つのラジオ ボタン オプションが指定された ListItem コレクション エディターを示しています。

追加

図 13: RadioButtonList に "Active" と "Discontinued" のオプションを追加する (クリックするとフルサイズの画像が表示されます)

ItemTemplate 内の RadioButtonList を編集できないため、その Enabled プロパティを false に設定します。Enabled プロパティは、EditItemTemplate の RadioButtonList のために true (既定値) のままにします。 これにより、編集されていない行のラジオ ボタンは読み取り専用になりますが、ユーザーは編集された行の RadioButton 値を変更できます。

製品の Discontinued データ フィールドに基づいて適切なラジオ ボタンが選択されるように、引き続き、RadioButtonList コントロールの SelectedValue プロパティを割り当てる必要があります。 このチュートリアルで前述した DropDownList と同様に、このデータ バインド構文は、宣言型マークアップに直接追加することも、RadioButtonList のスマート タグの [DataBindings の編集] リンクを使用して追加することもできます。

2 つの RadioButtonList を追加して構成した後、Discontinued TemplateField の宣言型マークアップは次のようになるはずです。

<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
    <ItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
          Enabled="False" SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
            SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </EditItemTemplate>
</asp:TemplateField>

これらの変更により、Discontinued 列はチェックボックスのリストから、ラジオ ボタン ペアのリストに変換されました (図 14 を参照)。 製品を編集するときに、適切なラジオ ボタンが選択され、製品の廃止済みの状態を更新するには、他のラジオ ボタンを選択して [更新] をクリックします。

廃止された CheckBox はラジオ ボタンのペアに置き換えられました

図 14: Discontinued の CheckBox をラジオ ボタンのペアに置き換える (クリックするとフルサイズの画像が表示されます)

Note

Products データベース内の Discontinued 列に NULL 値を含めることはできません。そのため、インターフェイス内の NULL 情報のキャプチャについて心配する必要はありません。 ただし、Discontinued 列に NULL 値を含めることができる場合は、カテゴリやサプライヤーの DropDownList と同様に、Value が空の文字列 (Value="") に設定された 3 番目のラジオ ボタンをリストに追加します。

まとめ

BoundField と CheckBoxField は読み取り専用、編集、挿入のインターフェイスを自動的にレンダリングしますが、カスタマイズする機能がありません。 ただし、多くの場合、(前のチュートリアルで説明したように) 検証コントロールを追加したり、(このチュートリアルで説明したように) データ収集のユーザー インターフェイスをカスタマイズしたりして、編集または挿入のインターフェイスをカスタマイズする必要があります。 TemplateField を使用したインターフェイスのカスタマイズは、次の手順に要約できます。

  1. TemplateField を追加するか、既存の BoundField または CheckBoxField を TemplateField に変換する
  2. 必要に応じてインターフェイスを拡張する
  3. 双方向データ バインドを使用して、新しく追加された Web コントロールに適切なデータ フィールドをバインドする

組み込みの ASP.NET Web コントロールを使用するだけでなく、カスタムのコンパイル済みサーバー コントロールとユーザー コントロールを使用して TemplateField のテンプレートをカスタマイズすることもできます。

プログラミングに満足!

著者について

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