次の方法で共有


ObjectDataSource のパラメーター値をプログラミングで設定する (C#)

スコット・ミッチェル著

PDF をダウンロードする

このチュートリアルでは、1 つの入力パラメーターを受け取り、データを返すメソッドを DAL と BLL に追加する方法について説明します。 この例では、このパラメーターをプログラムで設定します。

イントロダクション

前のチュートリアルで説明したように、ObjectDataSource のメソッドにパラメーター値を宣言的に渡すためのオプションがいくつかあります。 パラメーター値がハードコーディングされている場合、ページ上の Web コントロールから取得された場合、またはデータ ソース Parameter オブジェクトで読み取り可能なその他のソースにある場合は、コード行を記述することなく、その値を入力パラメーターにバインドできます。

ただし、パラメーター値が、組み込みのデータ ソースの 1 つ Parameter オブジェクトによってまだ考慮されていないソースから取得される場合があります。 サイトでユーザー アカウントがサポートされている場合は、現在ログインしている訪問者のユーザー ID に基づいてパラメーターを設定できます。 または、ObjectDataSource の基になるオブジェクトのメソッドに渡す前に、パラメーター値をカスタマイズする必要があります。

ObjectDataSource の Select メソッドが呼び出されるたびに、ObjectDataSource は最初に Selecting イベントを発生させます。 その後、ObjectDataSource の基になるオブジェクトのメソッドが呼び出されます。 それが完了すると、ObjectDataSource の Selected イベント が発生します(このイベントの一連の流れは図 1 に示されています)。 ObjectDataSource の基になるオブジェクトのメソッドに渡されるパラメーター値は、 Selecting イベントのイベント ハンドラーで設定またはカスタマイズできます。

ObjectDataSource の選択および選択イベントは、基になるオブジェクトのメソッドが呼び出される前と後に発生します。

図 1: ObjectDataSource の Selected イベントと Selecting イベントは、基になるオブジェクトのメソッドが呼び出される前と後に発生します (フルサイズの画像を表示するにはクリックします)。

このチュートリアルでは、dal と BLL にメソッドを追加して、Month 型の単一の入力パラメーター intを受け取り、指定したEmployeesDataTableで雇用記念日を持つ従業員が入力したMonth オブジェクトを返す方法について説明します。 この例では、現在の月に基づいてプログラムでこのパラメーターを設定し、"今月の従業員の記念日" の一覧を示します。

それでは始めましょう。

手順 1: メソッドを追加するEmployeesTableAdapter

最初の例では、指定した月に HireDate が発生した従業員を取得する手段を追加する必要があります。 アーキテクチャに従ってこの機能を提供するには、まず、適切な SQL ステートメントにマップするメソッドを EmployeesTableAdapter に作成する必要があります。 これを実現するには、まず Northwind Typed DataSet を開きます。 EmployeesTableAdapter ラベルを右クリックし、[クエリの追加] を選択します。

EmployeesTableAdapter に新しいクエリを追加する

図 2: EmployeesTableAdapter に新しいクエリを追加する (フルサイズの画像を表示する をクリックします)

行を返す SQL ステートメントを追加することを選択します。 [SELECTステートメントの指定] 画面に達すると、SELECTの既定のEmployeesTableAdapterステートメントが既に読み込まれます。 WHERE句 (WHERE DATEPART(m, HireDate) = @Month) を追加するだけです。 DATEPART は、 datetime 型の特定の日付部分を返す T-SQL 関数です。この場合、 DATEPART を使用して HireDate 列の月を返します。

Return Only Those Rows Where the HireDate Column is Less Than or Equal to the <span class= Parameter" /> 以下の行のみを返します

図 3: HireDate 列が @HiredBeforeDate パラメーター以下の行のみを返します (フルサイズの画像を表示する をクリックします)。

最後に、 FillByGetDataBy のメソッド名をそれぞれ FillByHiredDateMonthGetEmployeesByHiredDateMonthに変更します。

FillBy と GetDataBy よりも適切なメソッド名を選択する

図 4: FillByGetDataBy よりも適切なメソッド名を選択する (フルサイズの画像を表示する をクリックします)

[完了] をクリックしてウィザードを完了し、DataSet のデザイン 画面に戻ります。 EmployeesTableAdapterには、指定した月に採用された従業員にアクセスするための新しい一連のメソッドが含まれるようになりました。

DataSet のデザイン サーフェイスに新しいメソッドが表示される

図 5: DataSet のデザイン サーフェイスに新しいメソッドが表示されます (フルサイズの画像を表示する をクリックします)。

手順 2: ビジネス ロジック レイヤーにGetEmployeesByHiredDateMonth(month)Method を追加する

アプリケーション アーキテクチャではビジネス ロジックとデータ アクセス ロジックに別のレイヤーを使用するため、指定した日付より前に採用された従業員を取得するために DAL を呼び出すメソッドを BLL に追加する必要があります。 EmployeesBLL.cs ファイルを開き、次のメソッドを追加します。

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
    return Adapter.GetEmployeesByHiredDateMonth(month);
}

このクラスの他のメソッドと同様に、 GetEmployeesByHiredDateMonth(month) は DAL を呼び出して結果を返します。

手順 3: 今月の採用記念日を持つ従業員を表示する

この例の最後の手順は、採用記念日が今月である従業員を表示することです。 まず、ProgrammaticParams.aspx フォルダーのBasicReporting ページに GridView を追加し、新しい ObjectDataSource をデータ ソースとして追加します。 EmployeesBLLSelectMethod に設定されたGetEmployeesByHiredDateMonth(month) クラスを使用するように ObjectDataSource を構成します。

EmployeesBLL クラスを使用する

図 6: EmployeesBLL クラスを使用する (フルサイズの画像を表示する] をクリックします)

GetEmployeesByHiredDateMonth(month) メソッドから選択する

図 7: GetEmployeesByHiredDateMonth(month) メソッドから選択 (フルサイズの画像を表示する をクリックします)

最後の画面では、パラメーター値のソース month 指定するように求められます。 この値はプログラムで設定するため、[パラメーター ソース] は既定の [なし] オプションのままにして、[完了] をクリックします。

パラメーター ソースを [なし] に設定したままにする

図 8: パラメーター ソースを [なし] のままにします (フルサイズの画像を表示する 場合はクリックします)

これにより、ObjectDataSource の Parameter コレクションに、値が指定されていないSelectParameters オブジェクトが作成されます。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
    <SelectParameters>
        <asp:Parameter Name="month" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

この値をプログラムで設定するには、ObjectDataSource の Selecting イベントのイベント ハンドラーを作成する必要があります。 これを行うには、デザイン ビューに移動し、ObjectDataSource をダブルクリックします。 または、ObjectDataSource を選択し、[プロパティ] ウィンドウに移動し、稲妻アイコンをクリックします。 次に、 Selecting イベントの横にあるテキスト ボックスをダブルクリックするか、使用するイベント ハンドラーの名前を入力します。

[プロパティ] ウィンドウで [稲妻] アイコンをクリックして、Web コントロールのイベントを一覧表示します。

図 9: [プロパティ] ウィンドウの [稲妻] アイコンをクリックして Web コントロールのイベントを一覧表示する

どちらの方法でも、ObjectDataSource の Selecting イベントの新しいイベント ハンドラーがページの分離コード クラスに追加されます。 このイベント ハンドラーでは、e.InputParameters[parameterName]を使用してパラメーター値の読み取りと書き込みを行うことができます。parameterNameは、Name タグ内の<asp:Parameter>属性の値です (InputParameters コレクションは、e.InputParameters[index]のように、序数でインデックスを作成することもできます)。 month パラメーターを現在の月に設定するには、Selecting イベント ハンドラーに次のコードを追加します。

protected void ObjectDataSource1_Selecting
    (object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["month"] = DateTime.Now.Month;
}

ブラウザーでこのページを訪問すると、今月 (3 月) に新たに採用された従業員が Laura Callahan 1 人だけであることがわかります。Laura Callahan は 1994 年から会社に在籍しています。

今月の記念日が表示されている従業員

図 10: 今月の記念日が表示されている従業員 (フルサイズの画像を表示する をクリックします)

概要

ObjectDataSource のパラメーターの値は、通常、コード行を必要とせずに宣言によって設定できますが、パラメーター値をプログラムで簡単に設定できます。 必要なのは、基になるオブジェクトのメソッドが呼び出される前に発生する ObjectDataSource の Selecting イベントのイベント ハンドラーを作成し、 InputParameters コレクションを使用して 1 つ以上のパラメーターの値を手動で設定することです。

このチュートリアルでは、「基本的なレポート」セクションを終了します。 次のチュートリアルでは、「フィルター処理と Master-Details シナリオ」セクションを開始します。ここでは、訪問者がデータをフィルター処理し、マスター レポートから詳細レポートにドリルダウンできるようにする手法について説明します。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジを使用しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・セルフ ASP.NET 24時間で2.0です。 彼には mitchell@4GuysFromRolla.comで連絡できます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルの校閲者はヒルトン・ギセナウでした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、mitchell@4GuysFromRolla.comにメッセージを送ってください。