このチュートリアルでは、ハードコーディングされた値に設定されたパラメーターを使用して、DetailsView コントロール内で表示されるデータを選択する方法について説明します。
はじめに
最後のチュートリアルでは、GetProducts()
クラスから ProductsBLL
メソッドを呼び出した ObjectDataSource コントロールにバインドされた GridView、DetailsView、および FormView コントロールを使用してデータを表示する方法について説明しました。 この GetProducts()
メソッドは、Northwind データベースの Products
テーブルのすべてのレコードが設定された、厳密に型指定された DataTable を返します。 この ProductsBLL
クラスには、製品のサブセットのみを返す追加のメソッド (GetProductByProductID(productID)
、GetProductsByCategoryID(categoryID)
、GetProductsBySupplierID(supplierID)
) が含まれています。 これら 3 つのメソッドには、返される製品情報のフィルター処理方法を示す入力パラメーターが必要です。
ObjectDataSource を使用して、入力パラメーターを必要とするメソッドを呼び出すことができますが、これを行うには、これらのパラメーターの値の取得元を指定する必要があります。 パラメーター値は、ハードコーディングすることも、さまざまな動的ソース (クエリ文字列値、セッション変数、ページ上の Web コントロールのプロパティ値など) から取得することもできます。
このチュートリアルでは、まず、ハードコーディングされた値に設定されたパラメーターを使用する方法について説明します。 具体的には、DetailsView を特定の製品 (つまり、Chef Anton's Gumbo Mix) に関する情報を表示するページに追加する方法を説明していきます。この製品の ProductID
は 5 です。 次に、Web コントロールに基づいてパラメーター値を設定する方法についてみていきます。 特に、TextBox を使用してユーザーが国/地域を入力できるようにします。その後、ボタンをクリックすると、その国/地域内に存在するサプライヤーの一覧を表示できます。
ハードコーディングされたパラメーター値の使用
最初の例では、まず DetailsView コントロールを DeclarativeParams.aspx
フォルダー内の BasicReporting
ページに追加します。 DetailsView のスマート タグで、ドロップダウン リストから [新しいデータ ソース] を選択し、ObjectDataSource の追加を選択します。<>
図 1: ObjectDataSource をページに追加する (フルサイズの画像を表示する をクリックします)
これにより自動的に、ObjectDataSource コントロールの [データ ソースの選択] ウィザードが開始されます。 ウィザードの最初の画面で ProductsBLL
クラスを選択します。
図 2: ProductsBLL
クラスの選択 (フルサイズの画像を表示する をクリックします)
特定の製品に関する情報を表示したいため、GetProductByProductID(productID)
メソッドを使用します。
図 3: GetProductByProductID(productID)
方法を選択します (フルサイズの画像を表示するにはクリックします)
選択したメソッドにはパラメーターが含まれるため、ウィザードにはもう 1 つの画面があり、そこで、パラメーターに使用する値を定義するように求められます。 左側のリストには、選択したメソッドのすべてのパラメーターが表示されます。
GetProductByProductID(productID)
の場合は 1 つだけで、productID
です。 右側では、選択したパラメーターの値を指定できます。 パラメーター ソースのドロップダウン リストには、パラメーター値に使用できるさまざまなソースが列挙されます。
productID
パラメーターには 5 をハードコーディングされた値として指定するため、パラメーター ソースは [None] のままにし、DefaultValue テキストボックスには「5」と入力します。
図 4: Hard-Coded パラメーター値 5 が productID
パラメーターに使用されます (フルサイズの画像を表示する をクリックします)。
データ ソースの構成ウィザードが完了すると、ObjectDataSource コントロールの宣言型マークアップには、Parameter
プロパティで定義されているメソッドで使用される各入力パラメーターの SelectParameters
オブジェクトが SelectMethod
コレクションの中に含まれます。 この例で使用しているメソッドは 1 つの入力パラメーター (parameterID
) しか必要としないため、ここにあるエントリは 1 つだけです。
SelectParameters
コレクションには、Parameter
名前空間内の System.Web.UI.WebControls
クラスから取得する任意のクラスを含めることができます。 ハードコーディングされたパラメーター値の場合、基本 Parameter
クラスが使用されますが、他のパラメーター ソース オプションでは派生 Parameter
クラスが使用されます。必要に応じて、独自の カスタム パラメーター型を作成することもできます。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
<SelectParameters>
<asp:Parameter DefaultValue="5" Name="productID"
Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
注
自分のコンピューター上でこの手順に沿って作業している場合、この時点で表示される宣言型マークアップには、InsertMethod
、UpdateMethod
、DeleteMethod
のプロパティが DeleteParameters
とともに含まれている可能性があります。 ObjectDataSource のデータ ソースの選択ウィザードでは、挿入、更新、削除に使用するメソッドが ProductBLL
から自動的に指定されるため、明示的に除外しない限り、それらが上記のマークアップに含まれます。
このページにアクセスすると、データ Web コントロールは ObjectDataSource の Select
メソッドを呼び出します。これにより、ProductsBLL
入力パラメーターにハードコーディングされた値の 5 を使用して、GetProductByProductID(productID)
クラスの productID
メソッドが呼び出されます。 このメソッドは、Chef Anton's Gumbo Mix (ProductDataTable
が 5 の製品) に関する情報を持つ 1 行が含まれる厳密に型指定された ProductID
オブジェクトを返します。
図 5: シェフ アントンのガンボ ミックスに関する情報が表示されます (フルサイズの画像を表示する をクリックします)。
パラメーター値を Web コントロールのプロパティ値に設定する
ObjectDataSource のパラメーター値は、ページ上の Web コントロールの値に基づいて設定することもできます。 これを説明するために、ユーザーが指定した国/地域内にあるすべてのサプライヤーを一覧表示する GridView を作成しましょう。 これを実現するには、まず、ユーザーが国/国名を入力できる TextBox をページに追加します。 この TextBox コントロールの [ID
] プロパティを「CountryName
」に設定します。 さらに、Button Web コントロールも追加します。
図 6: ID
CountryName
を使用してページにテキスト ボックスを追加する (フルサイズの画像を表示する をクリックします)
次に、ページに GridView を追加し、スマートタグで新しい ObjectDataSource の追加を選択します。 サプライヤー情報を表示したいので、ウィザードの最初の画面で SuppliersBLL
クラスを選択します。 次の画面で、GetSuppliersByCountry(country)
メソッドを選択します。
図 7: GetSuppliersByCountry(country)
方法の選択 (フルサイズの画像を表示する] をクリックします)
GetSuppliersByCountry(country)
メソッドには入力パラメーターがあるため、ウィザードではパラメーター値を選択する最終画面が再度表示されます。 今回は、パラメーター ソースを [Control] に設定します。 これにより、ControlID のドロップダウン リストにページ上のコントロールの名前が設定されます。リストから CountryName
コントロールを選択します。 ページに最初にアクセスしたときには、CountryName
の TextBox は空白となり、結果は返されず、何も表示されません。 デフォルトで何らかの結果を表示する場合は、それに応じた DefaultValue のテキストボックスを設定します。
図 8: パラメーター値を CountryName
コントロール値に設定する (フルサイズの画像を表示する をクリックします)
ObjectDataSource の宣言型マークアップは、標準の オブジェクトではなく Parameter
使用する最初の例とは若干異なります。
ControlParameter
には、Web コントロールの ID
と、パラメーター (PropertyName
) に使用するプロパティ値を指定する追加のプロパティがあります。 データ ソースの構成ウィザードは、TextBox の場合にはパラメーター値に Text
プロパティを使用した方がよいことをスマートに判断しています。 ただし、Web コントロールとは異なるプロパティ値を使用したい場合は、ここで PropertyName
値を変更するか、ウィザード内の [詳細プロパティの表示] リンクをクリックします。
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
<SelectParameters>
<asp:ControlParameter ControlID="CountryName"
Name="country" PropertyName="Text"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
ページに最初にアクセスしたときには、CountryName
TextBox は空白です。 ObjectDataSource の Select
メソッドは GridView によって呼び出されていますが、null
値が GetSuppliersByCountry(country)
メソッドに渡されます。 TableAdapter は null
をデータベースの NULL
値 (DBNull.Value
) に変換しますが、GetSuppliersByCountry(country)
メソッドで使用されるクエリは NULL
パラメーターに @CategoryID
値が指定される場合は値を返さないように記述されています。 つまり、サプライヤーは返されません。
ただし、訪問者が国を入力し、[Show Suppliers] ボタンをクリックしてポストバックを発生させると、ObjectDataSource の Select
メソッドが再度クエリ実行されます (TextBox コントロールの Text
値が country
パラメーターとして渡されます)。
図 9: カナダのサプライヤーが表示されます (フルサイズの画像を表示する をクリックします)。
既定ですべてのサプライヤーを表示する
ページを最初に表示したときにサプライヤーを非表示にするのではなく、最初に "すべて" のサプライヤーを表示して、ユーザーが TextBox に国/地域の名前を入力することで、一覧表示を絞り込めるようにします。 TextBox が空の場合、SuppliersBLL
クラスの GetSuppliersByCountry(country)
メソッドは、その null
入力パラメーターに country
値が渡されます。 この null
値は DAL の GetSupplierByCountry(country)
メソッドに渡され、次のクエリ内の NULL
パラメーターに対するデータベースの @Country
値に変換されます。
SELECT SupplierID, CompanyName, Address, City, Country, Phone
FROM Suppliers
WHERE Country = @Country
Country = NULL
列に Country
値があるレコードの場合でも、式 NULL
は常に False を返します。したがって、レコードは返されません。
国名の TextBox が空のときに "すべて" のサプライヤーを返すには、BLL 内の メソッドを拡張して、country パラメーターが GetSuppliersByCountry(country)
の場合は GetSuppliers()
メソッドを呼び出し、それ以外の場合は DAL の null
メソッドを呼び出すことができます。GetSuppliersByCountry(country)
これには、国名が指定されていない場合にはすべてのサプライヤーを返し、country パラメーターが含まれている場合にはサプライヤーの適切なサブセットを返す効果があります。
GetSuppliersByCountry(country)
クラス内の SuppliersBLL
メソッドを次のように変更します。
public Northwind.SuppliersDataTable GetSuppliersByCountry(string country)
{
if (string.IsNullOrEmpty(country))
return GetSuppliers();
else
return Adapter.GetSuppliersByCountry(country);
}
この変更により、DeclarativeParams.aspx
ページには最初のアクセス時 (または CountryName
TextBox が空の場合) にすべてのサプライヤーが表示されます。
図 10: すべてのサプライヤーが既定で表示されるようになりました (フルサイズの画像を表示する をクリックします)。
まとめ
入力パラメーターを持つメソッドを使用するには、ObjectDataSource の SelectParameters
コレクション内のパラメーターの値を指定する必要があります。 パラメーターの種類が異なることで、パラメーター値を異なるさまざまなソースから取得できます。 デフォルトのパラメーター型ではハードコーディングされた値を使用しますが、クエリ文字列、セッション変数、Cookie、さらにはページ上の Web コントロールからユーザーが入力した値からでも、同じように簡単に (コード行なしで) パラメーター値を取得できます。
このチュートリアルで取り上げた例によって、宣言型パラメーター値の使用方法について説明しました。 ただし、現在の日時や、サイトでメンバーシップを使用している場合の訪問者のユーザー ID など、利用できないパラメーター ソースを使用する必要がある場合があります。 このようなシナリオでは、ObjectDataSource が基になるオブジェクトのメソッドを呼び出す前に、パラメーター値をプログラムで設定することができます。 これを行う方法については 、次のチュートリアルで説明します。
プログラミングに満足!
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジを使用しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・セルフ ASP.NET 24時間で2.0です。 彼にはmitchell@4GuysFromRolla.comで連絡できます。
特別な感謝
このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は Hilton Giesenow です。 今後の MSDN の記事を確認することに関心がありますか? その場合は、mitchell@4GuysFromRolla.comに連絡をください。