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