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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

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

The ObjectDataSource's Selected and Selecting Events Fire Before and After Its Underlying Object's Method is Invoked

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

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

それでは始めましょう。

ステップ 1: メソッドを EmployeesTableAdapter に追加する

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

Add a New Query to the EmployeesTableAdapter

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

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

Return Only Those Rows Where the HireDate Column is Less Than or Equal to the <span class=@HiredBeforeDate Parameter" />

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

最後に、FillBy および GetDataBy メソッドの名前をそれぞれ FillByHiredDateMonthGetEmployeesByHiredDateMonth に変更します。

Choose More Appropriate Method Names Than FillBy and GetDataBy

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

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

The New Methods Appear in the DataSet's Design Surface

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

ステップ 2: ビジネス ロジック レイヤーに GetEmployeesByHiredDateMonth(month) メソッドを追加する

アプリケーション アーキテクチャではビジネス ロジックとデータ アクセス ロジックに別々のレイヤーを使用するため、指定した日付より前に採用された従業員を取得するために 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: 採用記念日が今月にある従業員を表示する

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

Use the EmployeesBLL Class

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

Select From the GetEmployeesByHiredDateMonth(month) method

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

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

Leave the Parameter Source Set to None

図 8: [パラメーター ソース] を [なし] に設定したままにする (クリックするとフルサイズの画像が表示されます)

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

<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 イベントの横にあるテキストボックスをダブルクリックするか、使用するイベント ハンドラーの名前を入力します。

Click on the Lightning Bolt Icon in the Properties Window to List a Web Control's Events

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

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

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

ブラウザーからこのページにアクセスすると、今月 (3 月) に採用された従業員は Laura Callahan (1994 年から会社に勤務) だけであることがわかります。

Those Employees Whose Anniversaries This Month Are Shown

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

まとめ

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

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

プログラミングに満足!

著者について

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