宣言パラメーター (C#)
このチュートリアルでは、ハードコーディングされた値に設定されたパラメーターを使用して、DetailsView コントロール内で表示されるデータを選択する方法について説明します。
はじめに
前回のチュートリアルでは、ProductsBLL
クラスから GetProducts()
メソッドを呼び出した 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 コントロールを BasicReporting
フォルダー内の DeclarativeParams.aspx
ページに追加します。 DetailsView のスマート タグで、ドロップダウン リストから [新しいデータ ソース] を選択し、ObjectDataSource の追加を選択します。<>
図 1: ObjectDataSource をページに追加する (クリックするとフルサイズの画像が表示されます)
これにより自動的に、ObjectDataSource コントロールの [データ ソースの選択] ウィザードが開始されます。 ウィザードの最初の画面で ProductsBLL
クラスを選択します。
図 2: ProductsBLL
クラスを選択します (クリックするとフルサイズの画像が表示されます)
特定の製品に関する情報を表示したいため、GetProductByProductID(productID)
メソッドを使用します。
図 3: GetProductByProductID(productID)
メソッドを選択する (クリックするとフルサイズの画像が表示されます)
選択したメソッドにはパラメーターが含まれるため、ウィザードにはもう 1 つの画面があり、そこで、パラメーターに使用する値を定義するように求められます。 左側のリストには、選択したメソッドのすべてのパラメーターが表示されます。 GetProductByProductID(productID)
の場合は 1 つだけで、productID
です。 右側では、選択したパラメーターの値を指定できます。 パラメーター ソースのドロップダウン リストには、パラメーター値に使用できるさまざまなソースが列挙されます。 productID
パラメーターには 5 をハードコーディングされた値として指定するため、パラメーター ソースは [None] のままにし、DefaultValue テキストボックスには「5」と入力します。
図 4: productID
パラメーターには、ハードコーディングされたパラメーター値の 5 を使用する (クリックするとフルサイズの画像が表示されます)
データ ソースの構成ウィザードが完了すると、ObjectDataSource コントロールの宣言型マークアップには、SelectMethod
プロパティで定義されているメソッドで使用される各入力パラメーターの Parameter
オブジェクトが SelectParameters
コレクションの中に含まれます。 この例で使用しているメソッドは 1 つの入力パラメーター (parameterID
) しか必要としないため、ここにあるエントリは 1 つだけです。 SelectParameters
コレクションには、System.Web.UI.WebControls
名前空間内の Parameter
クラスから取得する任意のクラスを含めることができます。 ハードコーディングされたパラメーター値の場合は基底 Parameter
クラスが使用されますが、他のパラメーター ソース オプションでは派生 Parameter
クラスが使用されます。必要に応じて、独自のカスタム パラメーター型を作成することもできます。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
<SelectParameters>
<asp:Parameter DefaultValue="5" Name="productID"
Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
Note
自分のコンピューター上でこの手順に沿って作業している場合、この時点で表示される宣言型マークアップには、InsertMethod
、UpdateMethod
、DeleteMethod
のプロパティが DeleteParameters
とともに含まれている可能性があります。 ObjectDataSource のデータ ソースの選択ウィザードでは、挿入、更新、削除に使用するメソッドが ProductBLL
から自動的に指定されるため、明示的に除外しない限り、それらが上記のマークアップに含まれます。
このページにアクセスすると、データ Web コントロールは ObjectDataSource の Select
メソッドを呼び出します。これにより、productID
入力パラメーターにハードコーディングされた値の 5 を使用して、ProductsBLL
クラスの GetProductByProductID(productID)
メソッドが呼び出されます。 このメソッドは、Chef Anton's Gumbo Mix (ProductID
が 5 の製品) に関する情報を持つ 1 行が含まれる厳密に型指定された ProductDataTable
オブジェクトを返します。
図 5: Chef Anton's Gumbo Mix に関する情報が表示される (クリックするとフルサイズの画像が表示されます)
パラメーター値を 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 を使用します。 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)
メソッドで使用されるクエリは @CategoryID
パラメーターに NULL
値が指定される場合は値を返さないように記述されています。 つまり、サプライヤーは返されません。
ただし、訪問者が国を入力し、[Show Suppliers] ボタンをクリックしてポストバックを発生させると、ObjectDataSource の Select
メソッドが再度クエリ実行されます (TextBox コントロールの Text
値が country
パラメーターとして渡されます)。
図 9: カナダのサプライヤーが表示される (クリックするとフルサイズの画像が表示されます)
既定ですべてのサプライヤーを表示する
ページを最初に表示したときにサプライヤーを非表示にするのではなく、最初に "すべて" のサプライヤーを表示して、ユーザーが TextBox に国/地域の名前を入力することで、一覧表示を絞り込めるようにします。 TextBox が空の場合、SuppliersBLL
クラスの GetSuppliersByCountry(country)
メソッドは、その country
入力パラメーターに null
値が渡されます。 この null
値は DAL の GetSupplierByCountry(country)
メソッドに渡され、次のクエリ内の @Country
パラメーターに対するデータベースの NULL
値に変換されます。
SELECT SupplierID, CompanyName, Address, City, Country, Phone
FROM Suppliers
WHERE Country = @Country
Country
列に NULL
値があるレコードの場合でも、式 Country = NULL
は常に False を返します。したがって、レコードは返されません。
国名の TextBox が空のときに "すべて" のサプライヤーを返すには、BLL 内の GetSuppliersByCountry(country)
メソッドを拡張して、country パラメーターが null
の場合は GetSuppliers()
メソッドを呼び出し、それ以外の場合は DAL の GetSuppliersByCountry(country)
メソッドを呼び出すことができます。 これには、国名が指定されていない場合にはすべてのサプライヤーを返し、country パラメーターが含まれている場合にはサプライヤーの適切なサブセットを返す効果があります。
SuppliersBLL
クラス内の GetSuppliersByCountry(country)
メソッドを次のように変更します。
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 は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。
特別な感謝
このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は Hilton Giesenow です。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。