DataList の編集インターフェイスをカスタマイズする (VB)

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、DropDownLists と CheckBox を含む DataList のより豊富な編集インターフェイスを作成します。

はじめに

DataList の EditItemTemplate マークアップコントロールと Web コントロールは、編集可能なインターフェイスを定義します。 これまでに調べた編集可能な DataList の例では、編集可能なインターフェイスは TextBox Web コントロールで構成されています。 前の チュートリアル では、検証コントロールを追加することで、編集時のユーザー エクスペリエンスを改善しました。

EditItemTemplateさらに、 を展開して、DropDownLists、RadioButtonLists、Calendars などの TextBox 以外の Web コントロールを含めることができます。 TextBoxes と同様に、編集インターフェイスをカスタマイズして他の Web コントロールを含める場合は、次の手順を使用します。

  1. Web コントロールを に追加します EditItemTemplate
  2. databinding 構文を使用して、対応するデータ フィールド値を適切なプロパティに割り当てます。
  3. イベント ハンドラーで UpdateCommand 、プログラムによって Web コントロールの値にアクセスし、それを適切な BLL メソッドに渡します。

このチュートリアルでは、DropDownLists と CheckBox を含む DataList のより豊富な編集インターフェイスを作成します。 特に、製品情報を一覧表示し、製品名、仕入先、カテゴリ、および廃止された状態を更新できるようにする DataList を作成します (図 1 を参照)。

編集インターフェイスには、TextBox、2 つの DropDownList、CheckBox が含まれます

図 1: 編集インターフェイスには、TextBox、2 つの DropDownList、および CheckBox が含まれています (フルサイズの画像を表示するには、ここをクリックします)

手順 1: 製品情報の表示

DataList の編集可能なインターフェイスを作成する前に、まず読み取り専用インターフェイスを構築する必要があります。 まず、フォルダーからページをCustomizedUI.aspxEditDeleteDataList開き、Designerから DataList をページに追加し、そのIDプロパティを にProducts設定します。 DataList のスマート タグから、新しい ObjectDataSource を作成します。 この新しい ObjectDataSource ProductsDataSource という名前を付け、クラスの GetProducts メソッドからデータをProductsBLL取得するように構成します。 以前の編集可能な DataList チュートリアルと同様に、ビジネス ロジック レイヤーに直接移動して、編集した製品の情報を更新します。 したがって、[UPDATE]、[INSERT]、[DELETE] タブのドロップダウン リストを [(なし)] に設定します。

[UPDATE]、[INSERT]、[DELETE] タブDrop-Down [リスト] を [(なし)] に設定します

図 2: UPDATE、INSERT、DELETE の各タブDrop-Downリストを (なし) に設定します (クリックするとフルサイズの画像が表示されます)

ObjectDataSource を構成すると、Visual Studio によって DataList の既定値 ItemTemplate が作成され、返される各データ フィールドの名前と値が一覧表示されます。 ItemTemplateテンプレートに要素内の製品名と、カテゴリ名、仕入先名<h4>、価格、および廃止された状態が一覧表示されるように を変更します。 さらに、[編集] ボタンを追加し、その CommandName プロパティが [編集] に設定されていることを確認します。 私 ItemTemplate の宣言型マークアップは次のとおりです。

<ItemTemplate>
    <h4>
        <asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>' />
    </h4>
    <table border="0">
        <tr>
            <td class="ProductPropertyLabel">Category:</td>
            <td class="ProductPropertyValue">
                <asp:Label ID="CategoryNameLabel" runat="server"
                    Text='<%# Eval("CategoryName") %>' />
            </td>
            <td class="ProductPropertyLabel">Supplier:</td>
            <td class="ProductPropertyValue">
                <asp:Label ID="SupplierNameLabel" runat="server"
                    Text='<%# Eval("SupplierName") %>' />
            </td>
        </tr>
        <tr>
            <td class="ProductPropertyLabel">Discontinued:</td>
            <td class="ProductPropertyValue">
                <asp:Label ID="DiscontinuedLabel" runat="server"
                    Text='<%# Eval("Discontinued") %>' />
            </td>
            <td class="ProductPropertyLabel">Price:</td>
            <td class="ProductPropertyValue">
                <asp:Label ID="UnitPriceLabel" runat="server"
                    Text='<%# Eval("UnitPrice", "{0:C}") %>' />
            </td>
        </tr>
        <tr>
            <td colspan="4">
                <asp:Button runat="Server" ID="EditButton"
                    Text="Edit" CommandName="Edit" />
            </td>
        </tr>
    </table>
    <br />
</ItemTemplate>

上記のマークアップでは、製品名に h4 見出し、 <残りのフィールドに 4> 列 <table> を使用して製品情報がレイアウトされます。 ProductPropertyLabelおよび ProductPropertyValueStyles.cssで定義されている CSS クラスについては、前のチュートリアルで説明しました。 図 3 は、ブラウザーで表示したときの進行状況を示しています。

各製品の名前、仕入先、カテゴリ、廃止された状態、および価格が表示されます

図 3: 各製品の名前、仕入先、カテゴリ、廃止された状態、および価格が表示されている (フルサイズの画像を表示する をクリックします)。

手順 2: 編集インターフェイスに Web コントロールを追加する

カスタマイズされた DataList 編集インターフェイスを構築する最初の手順は、必要な Web コントロールを に追加することです EditItemTemplate。 特に、カテゴリには DropDownList、仕入先にはもう 1 つ、廃止された状態の場合は CheckBox が必要です。 この例では製品の価格は編集できないため、Label Web コントロールを使用して表示を続けることができます。

編集インターフェイスをカスタマイズするには、DataList のスマート タグから [テンプレートの編集] リンクをクリックし、ドロップダウン リストからオプションを選択 EditItemTemplate します。 DropDownList を に EditItemTemplate 追加し、その を ID に設定します Categories

カテゴリの DropDownList を追加する

図 4: カテゴリの DropDownList を追加する (クリックするとフルサイズの画像が表示されます)

次に、DropDownList のスマート タグから、[データ ソースの選択] オプションを選択し、 という名前 CategoriesDataSourceの新しい ObjectDataSource を作成します。 クラスの GetCategories() メソッドを使用するようにこの ObjectDataSource をCategoriesBLL構成します (図 5 を参照)。 次に、DropDownList のデータ ソース構成ウィザードによって、各 ListItem プロパティと Value プロパティに使用するデータ フィールドのText入力を求められます。 図 6 に示すように、DropDownList にデータ フィールドを表示 CategoryName させ、 を値として使用 CategoryID します。

CategoriesDataSource という名前の新しい ObjectDataSource を作成する

図 5: 名前付きの CategoriesDataSource 新しい ObjectDataSource を作成する (クリックするとフルサイズの画像が表示されます)

DropDownList の表示フィールドと値フィールドを構成する

図 6: DropDownList の表示フィールドと値フィールドを構成する (クリックするとフルサイズの画像が表示されます)

この一連の手順を繰り返して、仕入先の DropDownList を作成します。 この DropDownList の を IDSuppliers 設定し、その ObjectDataSource という名前を付けます SuppliersDataSource

2 つの DropDownList を追加した後、廃止された状態の CheckBox と、製品名の TextBox を追加します。 ID CheckBox と TextBox の s をそれぞれ と ProductNameDiscontinued設定します。 RequiredFieldValidator を追加して、ユーザーが製品名の値を確実に指定できるようにします。

最後に、[更新] ボタンと [キャンセル] ボタンを追加します。 これら 2 つのボタンでは、それぞれの CommandName プロパティが Update と Cancel に設定されている必要があります。

あなたが好きな編集インターフェイスをレイアウトすること自由に感じます。 次の宣言構文とスクリーン ショットが示すように、読み取り専用インターフェイスから同じ 4 列 <table> レイアウトを使用することを選択しました。

<EditItemTemplate>
    <h4>
        <asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>' />
    </h4>
    <table border="0">
        <tr>
            <td class="ProductPropertyLabel">Name:</td>
            <td colspan="3" class="ProductPropertyValue">
                <asp:TextBox runat="server" ID="ProductName" Width="90%" />
                <asp:RequiredFieldValidator ID="RequiredFieldValidator1"
                    ControlToValidate="ProductName"
                    ErrorMessage="You must enter a name for the product."
                    runat="server">*</asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td class="ProductPropertyLabel">Category:</td>
            <td class="ProductPropertyValue">
                <asp:DropDownList ID="Categories" runat="server"
                    DataSourceID="CategoriesDataSource"
                    DataTextField="CategoryName" DataValueField="CategoryID" />
            </td>
            <td class="ProductPropertyLabel">Supplier:</td>
            <td class="ProductPropertyValue">
                <asp:DropDownList ID="Suppliers"
                    DataSourceID="SuppliersDataSource" DataTextField="CompanyName"
                    DataValueField="SupplierID" runat="server" />
            </td>
        </tr>
        <tr>
            <td class="ProductPropertyLabel">Discontinued:</td>
            <td class="ProductPropertyValue">
                <asp:CheckBox runat="server" id="Discontinued" />
            </td>
            <td class="ProductPropertyLabel">Price:</td>
            <td class="ProductPropertyValue">
                <asp:Label ID="UnitPriceLabel" runat="server"
                    Text='<%# Eval("UnitPrice", "{0:C}") %>' />
            </td>
        </tr>
        <tr>
            <td colspan="4">
                <asp:Button runat="Server" ID="UpdateButton" CommandName="Update"
                    Text="Update" />
                 
                <asp:Button runat="Server" ID="CancelButton" CommandName="Cancel"
                    Text="Cancel" CausesValidation="False" />
            </td>
        </tr>
    </table>
    <br />
    <asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
        OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories"
        TypeName="CategoriesBLL">
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
        OldValuesParameterFormatString="original_{0}" SelectMethod="GetSuppliers"
        TypeName="SuppliersBLL">
    </asp:ObjectDataSource>
</EditItemTemplate>

編集インターフェイスは、Read-Only インターフェイスのようにレイアウトされます

図 7: 編集インターフェイスは、Read-Only インターフェイスと同様にレイアウトされています (フルサイズの画像を表示する をクリックします)

手順 3: EditCommand イベント ハンドラーと CancelCommand イベント ハンドラーを作成する

現在、 にはデータバインド構文EditItemTemplateはありません (からItemTemplate逐語的にコピーされた を除くUnitPriceLabel)。 データバインド構文を一時的に追加しますが、最初に DataList EditCommandCancelCommand と イベントのイベント ハンドラーを作成します。 イベント ハンドラーの EditCommand 役割は、[編集] ボタンがクリックされた DataList アイテムの編集インターフェイスをレンダリングすることです。一方 CancelCommand 、そのジョブは DataList を編集前の状態に戻す作業です。

これら 2 つのイベント ハンドラーを作成し、次のコードを使用させます。

Protected Sub Products_EditCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.EditCommand
    ' Set the DataList's EditItemIndex property to the
    ' index of the DataListItem that was clicked
    Products.EditItemIndex = e.Item.ItemIndex
    ' Rebind the data to the DataList
    Products.DataBind()
End Sub
Protected Sub Products_CancelCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.CancelCommand
    ' Set the DataList's EditItemIndex property to -1
    Products.EditItemIndex = -1
    ' Rebind the data to the DataList
    Products.DataBind()
End Sub

これら 2 つのイベント ハンドラーを配置すると、[編集] ボタンをクリックすると編集インターフェイスが表示され、[キャンセル] ボタンをクリックすると、編集されたアイテムが読み取り専用モードに戻ります。 図 8 は、Chef Anton s Gumbo Mix の [編集] ボタンがクリックされた後の DataList を示しています。 編集インターフェイスにデータバインド構文をまだ追加していないため、ProductNameTextBox は空白、DiscontinuedCheckBox はオフ、および DropDownLists から選択された最初のCategoriesSuppliers項目は空白です。

EditCommand イベント ハンドラーと CancelCommand イベント ハンドラーが追加され、[編集] ボタンが選択された後の DataList EditItemTemplate を示すスクリーンショット。

図 8: [編集] ボタンをクリックすると、編集インターフェイスが表示されます (クリックするとフルサイズの画像が表示されます)

手順 4: 編集インターフェイスに DataBinding 構文を追加する

編集インターフェイスに現在の製品の値を表示するには、データ バインド構文を使用して、データ フィールドの値を適切な Web コントロール値に割り当てる必要があります。 [テンプレートの編集] 画面に移動し、Web コントロールのスマート タグから [DataBindings の編集] リンクを選択することで、データバインド構文をDesignerに適用できます。 または、データバインド構文を宣言型マークアップに直接追加することもできます。

データ フィールドのProductName値を TextBox の Text プロパティにProductName割り当て、CategoryIDデータ SupplierID フィールドの値を SuppliersCategories および DropDownLists SelectedValue プロパティに割り当て、Discontinuedデータ フィールドの値を CheckBox プロパティCheckedDiscontinued割り当てます。 これらの変更を行った後、Designerまたは宣言型マークアップを使用して直接、ブラウザーを使用してページを再表示し、Chef Anton s Gumbo Mix の [編集] ボタンをクリックします。 図 9 に示すように、データバインド構文では、現在の値が TextBox、DropDownLists、CheckBox に追加されています。

DataBinding 構文が追加され、[編集] ボタンが選択された後の DataList EditItemTemplate を示すスクリーンショット。

図 9: [編集] ボタンをクリックすると、編集インターフェイスが表示されます (クリックするとフルサイズの画像が表示されます)

手順 5: UpdateCommand イベント ハンドラーにユーザーの変更を保存する

ユーザーが製品を編集して [更新] ボタンをクリックすると、ポストバックが発生し、DataList の UpdateCommand イベントが発生します。 イベント ハンドラーでは、 および の Web コントロール EditItemTemplate から BLL とのインターフェイスから値を読み取り、データベース内の製品を更新する必要があります。 前のチュートリアルで見たように、 ProductID 更新された製品の にはコレクションから DataKeys アクセスできます。 次のコードに示すように、ユーザーが入力したフィールドにアクセスするには、 を使用して FindControl("controlID")Web コントロールをプログラムで参照します。

Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
    Handles Products.UpdateCommand
    If Not Page.IsValid Then
        Exit Sub
    End If
    ' Read in the ProductID from the DataKeys collection
    Dim productID As Integer = Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
    ' Read in the product name and price values
    Dim productName As TextBox = CType(e.Item.FindControl("ProductName"), TextBox)
    Dim categories As DropDownList=CType(e.Item.FindControl("Categories"), DropDownList)
    Dim suppliers As DropDownList = CType(e.Item.FindControl("Suppliers"), DropDownList)
    Dim discontinued As CheckBox = CType(e.Item.FindControl("Discontinued"), CheckBox)
    Dim productNameValue As String = Nothing
    If productName.Text.Trim().Length > 0 Then
        productNameValue = productName.Text.Trim()
    End If
    Dim categoryIDValue As Integer = Convert.ToInt32(categories.SelectedValue)
    Dim supplierIDValue As Integer = Convert.ToInt32(suppliers.SelectedValue)
    Dim discontinuedValue As Boolean = discontinued.Checked
    ' Call the ProductsBLL's UpdateProduct method...
    Dim productsAPI As New ProductsBLL()
    productsAPI.UpdateProduct(productNameValue, categoryIDValue, supplierIDValue, _
        discontinuedValue, productID)
    ' Revert the DataList back to its pre-editing state
    Products.EditItemIndex = -1
    Products.DataBind()
End Sub

このコードは、ページ上のすべての検証コントロールが有効であることを確認するために、 プロパティに相談 Page.IsValid することから始まります。 が の場合Page.IsValid、編集された製品のProductID値がコレクションからDataKeys読み取られ、 内のデータ エントリ Web コントロールがプログラムによってEditItemTemplate参照Trueされます。 次に、これらの Web コントロールの値が変数に読み取られた後、適切な UpdateProduct オーバーロードに渡されます。 データを更新すると、DataList は編集前の状態に戻されます。

Note

コードとこの例に重点を置くために、 BLL と DAL-Level 例外の処理 に関するチュートリアルで追加された例外処理ロジックを省略しました。 演習として、このチュートリアルを完了した後にこの機能を追加します。

手順 6: NULL CategoryID と SupplierID 値の処理

Northwind データベースでは、テーブルとSupplierIDCategoryID列の値をProducts使用できますNULL。 ただし、現在、編集インターフェイスは値に対応 NULL していません。 または 列のCategoryIDSupplierID値を持つNULL製品を編集しようとすると、"Categories" に SelectedValue が含まれており、ArgumentOutOfRangeException項目の一覧に存在しないため無効な というエラー メッセージが表示されます。また、現在、製品のカテゴリまたはサプライヤー値を非NULL値から非値に変更するNULL方法はありません。

カテゴリとサプライヤーの DropDownLists の値をサポート NULL するには、追加 ListItemの を追加する必要があります。 私はこのListItem値として(None)をText使用することを選択しましたが、必要に応じて他の何か(空の文字列など)に変更することができます。 最後に、忘れずに DropDownLists AppendDataBoundItems を に True設定します。忘れた場合は、DropDownList にバインドされているカテゴリとサプライヤーによって、静的に追加された ListItemが上書きされます。

これらの変更を行った後、DataList の EditItemTemplate DropDownLists マークアップは次のようになります。

<asp:DropDownList ID="Categories" DataSourceID="CategoriesDataSource"
    DataTextField="CategoryName" DataValueField="CategoryID"  runat="server"
    SelectedValue='<%# Eval("CategoryID") %>' AppendDataBoundItems="True">
    <asp:ListItem Value=" Selected="True">(None)</asp:ListItem>
</asp:DropDownList>
...
<asp:DropDownList ID="Suppliers" DataSourceID="SuppliersDataSource"
    DataTextField="CompanyName" DataValueField="SupplierID" runat="server"
    SelectedValue='<%# Eval("SupplierID") %>' AppendDataBoundItems="True">
    <asp:ListItem Value=" Selected="True">(None)</asp:ListItem>
</asp:DropDownList>

Note

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

ブラウザーを使用して進行状況を確認してください。 製品を編集する場合、DropDownList Suppliers と DropDownList の両方に、DropDownList の先頭に (None) オプションがあることにCategories注意してください。

カテゴリと仕入先のドロップダウンリストには、(なし) オプションが含まれます

図 10: Categories および Suppliers DropDownLists には 、(なし) オプションが含まれています (フルサイズの画像を表示する場合はクリックします)

(None) オプションをデータベース NULL 値として保存するには、イベント ハンドラーに UpdateCommand 戻る必要があります。 categoryIDValue変数と supplierIDValue 変数を null 許容の整数に変更し、DropDownList s SelectedValue が空の文字列でない場合にのみ値Nothingを割り当てます。

Dim categoryIDValue As Nullable(Of Integer) = Nothing
If Not String.IsNullOrEmpty(categories.SelectedValue) Then
    categoryIDValue = Convert.ToInt32(categories.SelectedValue)
End If
Dim supplierIDValue As Nullable(Of Integer) = Nothing
If Not String.IsNullOrEmpty(suppliers.SelectedValue) Then
    supplierIDValue = Convert.ToInt32(suppliers.SelectedValue)
End If

この変更により、ユーザーがデータベース値 NothingUpdateProduct 対応するドロップダウン リストのいずれかから (None) オプションを選択した場合は、 の値が BLL メソッドに NULL 渡されます。

まとめ

このチュートリアルでは、3 つの異なる入力 Web コントロール、TextBox、2 つの DropDownList、CheckBox と検証コントロールを含む、より複雑な DataList 編集インターフェイスを作成する方法について説明しました。 編集インターフェイスを構築する場合、使用されている Web コントロールに関係なく、手順は同じです。最初に、Web コントロールを DataList EditItemTemplateに追加します。データバインド構文を使用して、対応するデータ フィールド値を適切な Web コントロール プロパティと共に割り当てます。イベント ハンドラーでは UpdateCommand 、Web コントロールとその適切なプロパティにプログラムでアクセスします。 値を BLL に渡します。

編集インターフェイスを作成する場合は、TextBoxes だけで構成されているか、異なる Web コントロールのコレクションで構成されているかに関係なく、データベース NULL 値を正しく処理してください。 を NULL 計算するときは、編集インターフェイスに既存 NULL の値を正しく表示するだけでなく、値を として NULLマークする手段を提供することが不可欠です。 DataLists の DropDownLists の場合、通常は、プロパティが明示的に空の文字列 (Value="") に設定されている静的ListItemValueを追加し、イベント ハンドラーにコードを追加してUpdateCommandNULL``ListItem が選択されたかどうかを判断します。

幸せなプログラミング!

著者について

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

特別な感謝

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