共用方式為


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

作者:Scott Mitchell

下載 PDF

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

簡介

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

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

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

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

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

在本教學課程中,我們將著眼於向 DAL 和 BLL 添加一個方法,該方法接受單個輸入參數 (Month 類型) IntegerEmployeesDataTable 返回一個物件,該物件填充有在指定的僱用週年紀念日的員工 Month。 我們的範例將根據當前月份以程式設計方式設定此參數,顯示「本月員工週年紀念日」清單。

現在就開始吧!

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

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

為 EmployeesTableAdapter 新增查詢

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

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

僅傳回 HireDate 列小於或等於 <span class= 的行@HiredBeforeDate 參數" />

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

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

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

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

按一下「完成」完成精靈並返回資料集的設計介面。 現在 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 新增到 BasicReporting 資料夾中的 ProgrammaticParams.aspx 頁面,然後新增新的 ObjectDataSource 作為其資料來源。 配置 ObjectDataSource 以使用 SelectMethod 設定為 GetEmployeesByHiredDateMonth(month)EmployeesBLL 類別。

使用 EmployeesBLL 類

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

從 GetEmployeesByHiredDateMonth(month) 方法中選擇

圖 7:選擇 GetEmployeesByHiredDateMonth(month) 方法 (點擊看大圖)

最後一個畫面要求我們提供 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<asp:Parameter> 標記中 Name 屬性的值 (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 年以來一直在該公司工作。

本月顯示週年紀念的員工

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

摘要

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

本教學課程結束了基本報告部分。 下一個教學課程從篩選和主詳細資訊場景部分開始,我們將介紹允許訪客篩選資料並從主報告深入詳細報告的技術。

祝您程式設計愉快!

關於作者

Scott Mitchell,七本 ASP/ASP.NET 書籍的作者和 4GuysFromRolla.com 創始人,自 1998 年以來便開始使用 Microsoft Web 技術。 Scott 擔任獨立顧問、講師和作家。 他的新書是 Sams Teach Yourself ASP.NET 2.0 in 24 Hours。 您可以透過 mitchell@4GuysFromRolla.com 或他的部落格 (可以在 http://ScottOnWriting.NET 找到) 與他聯繫。

特別感謝

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