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

作者:Scott Mitchell

下載 PDF

在本教學課程中,我們將探討如何將方法新增至 DAL 和 BLL,以接受單一輸入參數並傳回數據。 此範例會以程式設計方式設定此參數。

簡介

上一個教學課程中所見,有數個選項可用來以宣告方式將參數值傳遞至 ObjectDataSource 的方法。 如果參數值是硬式編碼,則來自頁面上的 Web 控件,或位於數據源物件可讀取的任何其他來源 Parameter 中,例如,該值可以系結至輸入參數,而不需要撰寫程式代碼行。

不過,有時候,當參數值來自某個來源尚未由其中一個內建數據源 Parameter 對象考慮時。 如果網站支援的使用者帳戶,我們可能會想要根據目前登入訪客的使用者標識符來設定 參數。 或者,我們可能需要先自定義參數值,再將其傳送至 ObjectDataSource 的基礎物件方法。

每當叫用 ObjectDataSource 的 Select 方法時,ObjectDataSource 會先引發其 Select 事件。 然後會叫用 ObjectDataSource 的基礎物件方法。 一旦完成 ObjectDataSource 的 Selected 事件 ,就會引發 (圖 1 說明此事件序列) 。 傳遞至 ObjectDataSource 基礎物件的 方法的參數值可以在事件的事件處理程式 Selecting 中設定或自定義。

叫用 ObjectDataSource 的選取和選取事件之前和之後,會叫用其基礎物件的方法

圖 1:在叫用 ObjectDataSource Selected 的 和 Selecting 事件之前和之後叫用其基礎物件的 方法 (按兩下即可檢視完整大小的影像)

在本教學課程中,我們將探討如何將方法新增至 DAL 和 BLL,該方法接受單一輸入參數 Month,其類型 Integer 為 ,並傳回 EmployeesDataTable 在指定 Month中具有其雇用周年日的員工所填入的物件。 我們的範例會根據目前月份以程序設計方式設定此參數,其中顯示「今年員工周年紀念日」的清單。

現在就開始吧!

步驟 1:將方法新增至EmployeesTableAdapter

在我們的第一個範例中,我們需要新增方法來擷取在指定月份發生的員工 HireDate 。 為了根據我們的架構提供這項功能,我們必須先在 中 EmployeesTableAdapter 建立對應至適當 SQL 語句的方法。 若要達成此目的,請從開啟 Northwind Typed DataSet 開始。 以滑鼠右鍵按鍵, EmployeesTableAdapter 然後選擇 [新增查詢]。

將新查詢新增至 EmployeesTableAdapter

圖 2:將新的查詢新增至 EmployeesTableAdapter (按下即可檢視大小完整的映射)

選擇新增會傳回數據列的 SQL 語句。 當您到達 [指定 SELECT 語句] 畫面時, SELECT 將會載入 的預設 EmployeesTableAdapter 語句。 只要在 子句中 WHERE 新增: WHERE DATEPART(m, HireDate) = @MonthDATEPART 是一種 T-SQL 函式,會傳回類型的特定日期部分 datetime ;在此案例中,我們會使用 DATEPART 傳回數據 HireDate 行的月份。

只傳回 HireDate 數據行小於或等於 <span class=@HiredBeforeDate Parameter“ />

圖 3:只傳回數據行小於或等於@HiredBeforeDate參數的數據列HireDate (按兩下即可檢視大小完整的影像)

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

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

圖 4:選擇比 和 FillByGetDataBy (更適當的方法名稱 ,按兩下即可檢視大小完整的影像)

按兩下 [完成] 以完成精靈,並返回DataSet的設計介面。 EmployeesTableAdapter現在應該包含一組新的方法來存取指定月份中僱用的員工。

新的方法會出現在 DataSet 的設計介面中

圖 5:新的方法會出現在 DataSet 的設計介面中, (按兩下即可檢視完整大小的影像)

步驟 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:使用 EmployeesBLL 類別 (按下即可檢視完整大小的影像)

從 GetEmployeesByHiredDateMonth (month) 方法選取

圖 7:從 GetEmployeesByHiredDateMonth(month) 方法中選取 (按兩下即可檢視完整大小的影像)

最後一個畫面會要求我們提供 month 參數值的來源。 因為我們會以程式設計方式設定此值,所以將 [參數來源] 保留為預設的 [無] 選項,然後按兩下 [完成]。

將參數來源設定為 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 的文字框中,或輸入您想要使用的事件處理程式名稱。 作為第三個選項,您可以從頁面程序代碼後置類別頂端的兩個下拉式清單中選取 ObjectDataSource 及其 Selecting 事件,以建立事件處理程式。

按兩下 [屬性] 視窗中的 [閃電圖示] 以列出 Web 控制件的事件

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

這三種方法會將 ObjectDataSource Selecting 事件的新事件處理程式新增至頁面的程式代碼後置類別。 在此事件處理程式中,我們可以使用 來讀取和寫入參數值,其中 parameterName 是標記中的<asp:Parameter>屬性值e.InputParameters(parameterName)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

透過瀏覽器瀏覽此頁面時,我們可以看到 (1994 年 3 月只有一位員工在 1994 年 3 月) Laura Callahan 僱用。

顯示此月份周年日的員工

圖 10:本月周年日顯示的員工 (按兩下即可檢視大小完整的影像)

摘要

雖然 ObjectDataSource 的參數值通常可以宣告方式設定,而不需要一行程式代碼,但很容易就能以程式設計方式設定參數值。 我們只需要建立 ObjectDataSource 事件的 Selecting 事件處理程式,它會在叫用基礎物件的方法之前引發,並透過集合手動設定一或多個參數 InputParameters 的值。

本教學課程將結束基本報告一節。 下一個教學課程會開始篩選和 Master-Details 案例一節,我們將探討允許訪客篩選數據並從主報表向下切入到詳細數據報表的技術。

快樂的程序設計!

關於作者

Scott Mitchell 是七份 ASP/ASP.NET 書籍的作者,以及 1998 年以來與 Microsoft Web 技術合作的 4GuysFromRolla.com 作者。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格來連線到 ,您可以在 找到http://ScottOnWriting.NET

特別感謝

本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的潛在客戶檢閱者是「三元」。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。