共用方式為


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

by Scott Mitchell

下載 PDF

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

簡介

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

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

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

The ObjectDataSource's Selected and Selecting Events Fire Before and After Its Underlying Object's Method is InvokedObjectDataSource 的 Selected 和 Selecting 事件在呼叫其底層物件的方法之前和之後觸發

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

在本教學課程中,我們將探討如何向 DAL 和 BLL 新增一個方法,該方法接受單個輸入參數 Month,其類型為 Integer,並返回一個 EmployeesDataTable 物件,該物件包含那些在指定 Month 具有僱用週年的員工。 我們的範例將根據當前月份以程式設計方式設定此參數,顯示「本月員工週年紀念日」清單。

現在就開始吧!

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

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

為 EmployeesTableAdapter 新增查詢

圖 2:將新查詢新增至EmployeesTableAdapter (點擊看大圖)

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

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

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

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

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

圖 4:選擇比 和 更適宜的方法名稱 (點擊看大圖)

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

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

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

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

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

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetEmployeesByHiredDateMonth(ByVal month As Integer) _
    As Northwind.EmployeesDataTable
    Return Adapter.GetEmployeesByHiredDateMonth(month)
End Function

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

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

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

使用 EmployeesBLL 類別

圖 6:使用 類别 (點擊看大圖)

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 事件旁的文字方塊,或輸入要使用的事件處理程序名稱。 作為第三個選項,您可以藉由從頁面後置程式碼類別頂部的兩個下拉清單中選擇 ObjectDataSource 及其 Selecting 事件來建立事件處理程序。

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

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

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

Protected Sub ObjectDataSource1_Selecting _
    (sender As Object, e As ObjectDataSourceSelectingEventArgs) _
        Handles ObjectDataSource1.Selecting
    e.InputParameters("month") = DateTime.Now.Month
End Sub

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

Those Employees Whose Anniversaries This Month Are Shown本月顯示週年紀念的員工

圖 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給我留言。

前一個