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

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、ハードコーディングされた値に設定されたパラメーターを使用して、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.aspxBasicReporting追加します。 DetailsView のスマート タグから、ドロップダウン リストから [新しいデータ ソース>] を選択<し、ObjectDataSource を追加することを選択します。

ObjectDataSource をページに追加する

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

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

ProductsBLL クラスを選択する

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

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

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

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

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

productID パラメーターには、Hard-Coded パラメーター値 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 コントロールも追加します。

Id CountryName を使用して TextBox をページに追加する

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

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

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

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

メソッドには GetSuppliersByCountry(country) 入力パラメーターがあるため、パラメーター値を選択するための最終画面がウィザードにもう一度表示されます。 今回は、 [パラメーター ソース] を [コントロール] に設定します。 これにより、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データベース値 (DBNull.Value) に変換しますが、 パラメーターに値を指定@CategoryIDしてもNULL値が返されないように、 メソッドでGetSuppliersByCountry(country)使用されるクエリが書NULLき込まれます。 つまり、サプライヤーは返されません。

ただし、訪問者が国に入り、[サプライヤーの表示] ボタンをクリックしてポストバックを行うと、ObjectDataSource の Select メソッドが再クエリされ、TextBox コントロールの Text 値が country パラメーターとして渡されます。

カナダからのサプライヤーが表示されます

図 9: カナダのサプライヤーが表示されている (フルサイズの画像を表示する をクリックします)

すべてのサプライヤーを既定で表示する

最初にページを表示するときにサプライヤーを表示するのではなく、最初 にすべての サプライヤーを表示し、ユーザーがテキストボックスに国/地域名を入力してリストを下ろせるようにすることができます。 TextBox が空の場合、SuppliersBLLクラスの GetSuppliersByCountry(country) メソッドは入力パラメーターの値countrynull渡されます。 この 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行をドロップしてください。