共用方式為


以程式設計方式設定 ObjectDataSource 的參數值 (C#)

by Scott Mitchell

下載 PDF

在本教學課程中,我們將研究為 DAL 和 BLL 添加一個方法,該方法接受單一輸入參數並傳回資料。 此範例將以程式設計方式設定此參數。

簡介

正如我們在 上一篇教程 中所看到的,有許多選項可以聲明式地將參數值傳遞給 ObjectDataSource 的方法。 例如,如果參數值是硬編碼的、來自頁面上的網頁控件或位於資料來源 Parameter 物件可讀的任何其他來源中,則可以將該值綁定到輸入參數,而不需要編寫任何程式碼。

然而,有時參數值可能來自一些尚未被其中一個內建資料來源 Parameter 物件考慮到的來源。 如果我們的網站支援使用者帳戶,我們可能需要根據目前登入訪客的使用者 ID 設定參數。 或者,我們可能需要在將參數值傳送到 ObjectDataSource 的底層物件的方法之前對其進行自訂。

每當呼叫 ObjectDataSource 的方法時,ObjectDataSource 會先引發其 Selecting 事件。 然後呼叫 ObjectDataSource 的底層物件的方法。 一旦這完成,ObjectDataSource 的 Selected 事件就會觸發。(圖 1 說明了這個事件順序)。 可以在 `Selecting` 事件的事件處理常式中設定或自訂傳遞到 ObjectDataSource 基礎物件方法的參數值。

ObjectDataSource 的 Selected 和 Selecting 事件在呼叫其底層物件的方法時,Selected 事件在之後觸發,而 Selecting 事件在之前觸發。

圖 1:ObjectDataSource 的 Selecting 和 Selected 事件在其底層物件的方法被呼叫之前和之後發生 (按一下查看全尺寸影像)

在本教學課程中,我們將探討添加一個方法到我們的 DAL 和 BLL,此方法會接受一個類型為 int 的單一輸入參數 Month 並返回一個已填充擁有在指定 Month 僱用紀念月份員工的 EmployeesDataTable 物件。 我們的範例將根據當前月份以程式設計方式設定此參數,顯示「本月員工週年紀念日」清單。

現在就開始吧!

第 1 步:新增一個方法至EmployeesTableAdapter

對於我們的第一個範例,我們需要新增一種方法來檢索那些在指定月份入職的員工。 為了根據我們的架構提供此功能,我們需要先在 EmployeesTableAdapter 中建立一個對應正確 SQL 陳述式的方法。 若要實現此目的,請先開啟 Northwind 類型資料集。 按右鍵點擊 EmployeesTableAdapter 標籤並選擇添加查詢。

為 EmployeesTableAdapter 添加新查詢

圖 2:新增查詢至 (點擊查看完整圖片)

選擇新增返回行的 SQL 陳述式。 當您到達「指定SELECT陳述式」畫面時,用於EmployeesTableAdapter的預設SELECT陳述式將會自動載入。 只需在 WHERE 子句中新增:WHERE DATEPART(m, HireDate) = @MonthDATEPART 是一個 T-SQL 函數,它會傳回特定的 datetime 日期部分;在本例中,我們使用 DATEPART 傳回 HireDate 列的月份。

僅傳回 HireDate 欄小於或等於 @HiredBeforeDate 參數的那些列

圖 3:僅傳回 列小於或等於 參數的行(點擊查看大圖)

最後,將 FillByGetDataBy 方法名稱分別改為 FillByHiredDateMonthGetEmployeesByHiredDateMonth

選擇比 FillBy 和 GetDataBy 更合適的方法名稱

圖 4:選擇比 FillByGetDataBy 更合適的方法名稱 (點擊查看完整尺寸圖片)

按一下「完成」完成精靈並返回資料集的設計介面。 現在 EmployeesTableAdapter 應該包括一組新的方法來存取在指定月份聘用的員工。

新方法出現在資料集的設計界面中。

圖 5:新方法出現在資料集的設計介面中 (點擊查看全尺寸影像)

步驟 2:將 GetEmployeesByHiredDateMonth(month) 方法新增至商業邏輯層

由於我們的應用程式架構對業務邏輯和資料存取邏輯使用單獨的層,因此我們需要向 BLL 添加一個方法,該方法向下調用 DAL 以檢索在指定日期之前僱用的員工。 開啟 EmployeesBLL.cs 檔案在其中新增以下方法:

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

與此類中的其他方法一樣,GetEmployeesByHiredDateMonth(month) 直接呼叫 DAL 並傳回結果即可。

步驟 3:顯示本月入職週年紀念日的員工

此範例的最後一步是顯示本月入職週年的員工。 首先將 GridView 新增到 ProgrammaticParams.aspx 資料夾中的 BasicReporting 頁面,然後新增新的 ObjectDataSource 作為其資料來源。 配置 ObjectDataSource 以使用 EmployeesBLL 類別,並將 SelectMethod 設定為 GetEmployeesByHiredDateMonth(month)

使用 EmployeesBLL 類別

圖 6:使用 EmployeesBLL 類別 (點擊以查看完整尺寸圖片)

Select From the GetEmployeesByHiredDateMonth(month) method從 GetEmployeesByHiredDateMonth(month) 方法中選擇

圖 7:從 方法 (點擊看大圖)

最後一個畫面要求我們提供 month 參數值的來源。 由於我們將以程式化方式設定此值,因此保持參數來源設定為預設的無選項,然後點擊完成。

將參數來源設定為無

圖 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按一下屬性視窗中的閃電圖示以列出 Web 控制項的事件

圖 9:按一下屬性視窗中的閃電圖示以列出 Web 控制項的事件

這兩種方法都會將 ObjectDataSource 的 Selecting 事件的新事件處理常式新增到頁面的程式碼後置類別。 在此事件處理程序中,我們可以使用 e.InputParameters[parameterName] 來讀取和寫入參數值,其中 parameterName 標記中 Name 屬性的值 (InputParameters 集合也可以按順序索引,如 e.InputParameters[index] 中所示)。 若要將 month 參數設定為目前的月份,請將以下內容新增至 Selecting 事件處理程序:

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

透過瀏覽器造訪此頁面時,我們可以看到本月 (3 月) 僅僱用了一名員工 Laura Callahan,她自 1994 年以來一直在該公司工作。

本月週年紀念的員工名單如下所示

圖10:僅顯示本月有週年紀念日的員工 (點擊可看大圖)

摘要

雖然 ObjectDataSource 的參數值通常可以以宣告方式設置,而不需要一行程式碼,但以程式設計方式設定參數值很容易。 我們需要做的就是為 ObjectDataSource 的 Selecting 事件建立一個事件處理程序,該事件在呼叫底層物件的方法之前觸發,並透過 InputParameters 集合手動設定一個或多個參數的值。

本教學課程結束了基本報告部分。 下一個教學課程將介紹篩選和主從層次場景。我們將探討一些技術,讓訪客可以篩選資料,並從主報告深入到詳細報告。

祝您程式設計愉快!

關於作者

斯科特·米切爾,七本 ASP/ASP.NET 書籍和 4GuysFromRolla.com 創始人的作者,自1998年以來一直與Microsoft Web 技術合作。 Scott 擔任獨立顧問、講師和作家。 他的新書是《24小時自學ASP.NET 2.0》。 可以透過 mitchell@4GuysFromRolla.com 聯絡他。

特別感謝

本教學課程系列已經過許多熱心的檢閱者檢閱。 本教學課程的主要審閱者是 Hilton Giesenow。 有興趣檢閱我即將推出的 MSDN 文章嗎? 如果是,請在 mitchell@4GuysFromRolla.com給我留言。

上一個 下一個