共用方式為


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

作者 :Scott Mitchell

下載 PDF

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

簡介

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

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

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

叫用 ObjectDataSource 的 Selected 和 Select 事件之前和之後會叫用其基礎物件的 方法

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

在本教學課程中,我們將探討如何將方法新增至 DAL 和 BLL,以接受單一輸入參數 Month,且類型 int 為 ,並傳回 EmployeesDataTable 物件,這些員工在指定的 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 類別=@HiredBeforeDate Parameter“ />

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

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

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

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

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

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

圖 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 類別,並將 設定為 SelectMethodGetEmployeesByHiredDateMonth(month)

使用 EmployeesBLL 類別

圖 6:使用類別 EmployeesBLL (按鍵即可檢視完整大小的影像)

從 GetEmployeesByHiredDateMonth (月) 方法中選取

圖 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 文字框,或輸入您想要使用的事件處理程式名稱。

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

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

這兩種方法會將 ObjectDataSource Selecting 事件的新事件處理程式新增至頁面的程式代碼後置類別。 在此事件處理程式中,我們可以使用 來讀取和寫入參數值,其中 parameterName 是標記中<asp:Parameter>屬性的值e.InputParameters[parameterName]Name, (InputParameters 集合也可以依序數編製索引,如同在) 中一樣e.InputParameters[index]。 若要將 month 參數設定為當月,請將下列內容新增至 Selecting 事件處理程式:

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

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

顯示本月周年日的員工

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

摘要

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

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

快樂的程序設計!

關於作者

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

特別感謝

本教學課程系列是由許多實用的檢閱者所檢閱。 本教學課程的首席檢閱者是「新式 Giesenow」。 想要檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行放在 mitchell@4GuysFromRolla.com。