宣言パラメーター (C#)

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、ハードコーディングされた値に設定されたパラメーターを使用して、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 の追加を選択します。<>

ObjectDataSource をページに追加する

図 1: ObjectDataSource をページに追加する (クリックするとフルサイズの画像が表示されます)

これにより自動的に、ObjectDataSource コントロールの [データ ソースの選択] ウィザードが開始されます。 ウィザードの最初の画面で ProductsBLL クラスを選択します。

ProductsBLL クラスを選択する

図 2: ProductsBLL クラスを選択します (クリックするとフルサイズの画像が表示されます)

特定の製品に関する情報を表示したいため、GetProductByProductID(productID) メソッドを使用します。

GetProductByProductID(productID) メソッドを選択する

図 3: GetProductByProductID(productID) メソッドを選択する (クリックするとフルサイズの画像が表示されます)

選択したメソッドにはパラメーターが含まれるため、ウィザードにはもう 1 つの画面があり、そこで、パラメーターに使用する値を定義するように求められます。 左側のリストには、選択したメソッドのすべてのパラメーターが表示されます。 GetProductByProductID(productID) の場合は 1 つだけで、productID です。 右側では、選択したパラメーターの値を指定できます。 パラメーター ソースのドロップダウン リストには、パラメーター値に使用できるさまざまなソースが列挙されます。 productID パラメーターには 5 をハードコーディングされた値として指定するため、パラメーター ソースは [None] のままにし、DefaultValue テキストボックスには「5」と入力します。

productID パラメーターには、ハードコーディングされたパラメーター値 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

自分のコンピューター上でこの手順に沿って作業している場合、この時点で表示される宣言型マークアップには、InsertMethodUpdateMethodDeleteMethod のプロパティが 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 コントロールも追加します。

ID CountryName を持つページにテキスト ボックスを追加する

図 6: ID CountryName を使用してページにテキスト ボックスを追加する (フルサイズの画像を表示するにはクリックします)

次に、ページに GridView を追加し、スマートタグで新しい ObjectDataSource の追加を選択します。 サプライヤー情報を表示したいので、ウィザードの最初の画面で SuppliersBLL クラスを選択します。 次の画面で、GetSuppliersByCountry(country) メソッドを選択します。

GetSuppliersByCountry(country) メソッドを選択する

図 7: GetSuppliersByCountry(country) メソッドを選択する (クリックするとフルサイズの画像が表示されます)

GetSuppliersByCountry(country) メソッドには入力パラメーターがあるため、ウィザードではパラメーター値を選択する最終画面が再度表示されます。 今回は、パラメーター ソースを [Control] に設定します。 これにより、ControlID のドロップダウン リストにページ上のコントロールの名前が設定されます。リストから CountryName コントロールを選択します。 ページに最初にアクセスしたときには、CountryName の TextBox は空白となり、結果は返されず、何も表示されません。 デフォルトで何らかの結果を表示する場合は、それに応じた DefaultValue のテキストボックスを設定します。

パラメーター値を CountryName コントロール値に設定する

図 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行をドロップしてください。