简介
如前一教程所述,声明性地向ObjectDataSource 的方法传递参数的方法有很多。例如,如果参数值是固定值、来自页面上的 Web 控件或是可被某个数据源 Parameter 对象读取的任何其他源,则无需编写代码就可将该值绑定到输入参数。
但有时参数值的来源尚未被内置的某个数据源 Parameter 对象说明。如果我们的站点支持用户账户,我们可能希望基于当前登录的用户 ID 来设置参数。或者可能需要自定义该参数值,然后将其发送至 ObjectDataSource 的底层对象的方法。
无论什么时候调用 ObjectDataSource 的 Select 方法,ObjectDataSource 将首先引发它的 Selecting 事件 。然后调用 ObjectDataSource 的底层对象的方法。这个过程一旦完成,ObjectDataSource 的 Selected 事件 便被触发。传递给 ObjectDataSource 的底层对象的方法的参数值可以在 Selecting 事件的事件处理程序中设置或定制。
图1 :在调用 ObjectDataSource 的 底层对象的方法之前、之后将分别触发ObjectDataSource 的Selecting 和 Selected 事件
本教程中,我们将介绍如何为 DAL 和 BLL 添加一个方法,该方法接受 int 类型的输入参数 Month ,并返回一个 EmployeesDataTable 对象,该对象的填充数据为在指定月份受雇满周年的员工。本文示例将通过编码基于当前月份设置此参数,并显示“本月受雇满周年员工”列表。
让我们开始吧 !
步骤1:向EmployeesTableAdapter 添加一个方法
在第一个示例中,我们需要增加一个办法来检索其 HireDate 在指定月份的员工。要按照我们的架构提供此功能,需要首先在 EmployeesTableAdapter 中创建一个方法,映射到正确的SQL 语句。为此,要先打开 Northwind Typed DataSet 。右键单击 EmployeesTableAdapter 标签并选择 Add Query 。
图2 :向EmployeesTableAdapter 添加新查询
选择添加一个返回行的 SQL 语句。进入 Specify a SELECT Statement 屏幕后,会发现EmployeesTableAdapter 的默认 SELECT 语句已经载入。只需在 WHERE 子句添加如下内容 :WHERE DATEPART(m, HireDate) = @Month 。 DATEPART 是一个T-SQL 功能函数,返回属于某个日期时间类型的特定日期部分。本例中使用DATEPART 返回 HireDate 列的月份。
图3 :只返回 HireDate 中的月份部分等于 @Month 参数的行
最后,将 FillBy 和 GetDataBy 方法分别重命名为 FillByHiredDateMonth 和 GetEmployeesByHiredDateMonth 。
图4 :选择比 FillBy 和 GetDataBy 更合适的方法名称
单击Finish 完成向导并返回到 DataSet 的设计界面。EmployeesTableAdapter 现在应包含一个访问特定月份受雇员工的新方法。
图5 :显示在 DataSet 的设计界面中的新方法
步骤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 :显示本月受雇满周年的员工
本示例的最后一个步骤是显示本月受雇满周年的员工。首先,向BasicReporting 文件夹中的 ProgrammaticParams.aspx 页面添加一个GridView ,再添加一个新的 ObjectDataSource 作为其数据源。配置 ObjectDataSource 使用将 SelectMethod 设置为 GetEmployeesByHiredDateMonth(month) 的 EmployeesBLL类。
图6 :使用 EmployeesBLL 类
图7 :从 GetEmployeesByHiredDateMonth(month) 方法选择
在最后一个屏幕上需要提供月份参数值的源。由于我们将通过编码设置此值,所以将 Parameter source 设置为默认的 None 选项,然后单击 Finish 。
图8 :保留 Parameter Source 的 None 设置
这将在 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 事件创建一个事件处理程序。为此,先转入Design 视图然后双击 ObjectDataSource 。或者,选中 ObjectDataSource , 转入Properties 窗口 , 然后单击闪电图形的图标。接下来,双击 Selecting 事件旁的文本框,或输入想使用的事件处理程序的名称。
图9 :单击 Properties 窗口的闪电图形的图标以列出Web 控件的事件
上述两种方法都可在页面代码文件中为ObjectDataSource 的Selecting 事件新增一个事件处理程序。在此事件处理程序中,可以使用e.InputParameters[parameterName] 读取和写入参数值。此处的 parameterName 为<asp:Parameter> 标记中的Name 属性的值(InputParameters 集合也可象 e.InputParameters[index] 中那样按顺序索引 )。要将月份参数设置为当前月份,需要向 Selecting 事件处理程序添加如下代码:
protected void ObjectDataSource1_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["month"] = DateTime.Now.Month;
}
使用浏览器访问该页面时,可以看见本月(三月)只雇用了一位员工 (Laura Callahan) ,该员工自 1994 年起就在公司任职。
图10 :显示本月受雇满周年的所有员工
小结
尽管通常情况下无需编码就可以声明性地设置 ObjectDataSource 的参数值,不过通过编码设置参数值同样简单。只需要为 ObjectDataSource 的 Selecting 事件创建一个事件处理程序,使其在调用底层对象方法之前触发,并通过 InputParameters 集合手动的为一个或多个参数设置参数值。
本篇教程是 Basic Reporting 部分的结尾。下一教程开始介绍筛选和主/明细情形部分,内容 包括让访问者筛选数据以及从主报表深入明细报表的技巧。
快乐编程!