以编程方式设置 ObjectDataSource 的参数值 (VB)

作者 :斯科特·米切尔

下载 PDF

本教程介绍如何向 DAL 和 BLL 添加一个接受单个输入参数并返回数据的方法。 此示例将以编程方式设置此参数。

介绍

如 上一教程所示,许多选项可用于以声明方式将参数值传递给 ObjectDataSource 的方法。 如果参数值是硬编码的,则来自页面上的 Web 控件,或者位于数据源对象可读的任何其他源 Parameter 中,例如,该值可以绑定到输入参数,而无需编写代码行。

但是,有时,当参数值来自某个未被内置数据源 Parameter 对象考虑到的来源时。 如果站点支持的用户帐户,我们可能需要根据当前登录访问者的用户 ID 设置参数。 或者,可能需要先自定义参数值,然后再将其发送到 ObjectDataSource 的基础对象的方法。

每当调用 ObjectDataSource Select 的方法时,ObjectDataSource 将首先引发其 选择事件。 然后调用 ObjectDataSource 的基础对象的方法。 一旦完成,ObjectDataSource 的 Selected 事件 就会触发(图 1 说明了此事件序列)。 可以在 Selecting 事件的事件处理程序中设置或自定义传递到 ObjectDataSource 的基础对象方法的参数值。

ObjectDataSource 的 Selecting 和 Selected 事件在其基础对象的方法调用之前和之后触发

图 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) = @Month. DATEPART 是一个 T-SQL 函数,它返回类型的特定日期部分 datetime ;在本例中,我们将使用该 DATEPART 函数返回列的 HireDate 月份。

仅返回那些 HireDate 列值小于或等于 @HiredBeforeDate 参数的行“/>

图 3:仅返回HireDate列小于或等于@HiredBeforeDate参数的行(单击可查看全尺寸图像)

最后,分别将 FillBy 名称和 GetDataBy 方法名称更改为 FillByHiredDateMonth 和 GetEmployeesByHiredDateMonth。

选择比 FillBy 和 GetDataBy 更适当的方法名称

图 4:选择比和 FillByGetDataBy 更合适的方法名称(单击以查看全尺寸图像)

单击“完成”以完成向导并返回到 DataSet 的设计界面。 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:使用 EmployeesBLL 类(单击以查看全尺寸图像)

从 GetEmployeesByHiredDateMonth(month) 方法中选择

图 7:从 GetEmployeesByHiredDateMonth(month) 方法中选择(单击以查看全尺寸图像)

最后一个屏幕要求我们提供 month 参数值的源。 由于我们将以编程方式设置此值,因此将参数源设置为默认的 None 选项,然后单击“完成”。

将参数源设置为“无”

图 8:将参数源设置为“无”(单击可查看全尺寸图像)

这将在 ObjectDataSource 的Parameter集合中创建一个SelectParameters未指定值的对象。

<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年以来一直在公司工作。

那些本月有周年纪念的员工被展示

图 10:显示本月周年纪念日的员工(单击可查看全尺寸图像)

概要

虽然 ObjectDataSource 的参数值通常可以通过声明方式设置,而无需一行代码,但很容易以编程方式设置参数值。 我们需要做的就是为 ObjectDataSource 的事件 Selecting 创建事件处理程序,该事件处理程序在调用基础对象的方法之前触发,并通过集合手动设置一个或多个参数 InputParameters 的值。

本教程总结了“基本报告”部分。 下一教程将启动“筛选和 Master-Details 方案”部分,我们将介绍允许访问者筛选数据并从主报表向下钻取到详细信息报表的技术。

快乐编程!

关于作者

斯科特·米切尔,七本 ASP/ASP.NET 书籍的作者和 4GuysFromRolla.com 的创始人,自1998年以来一直在与Microsoft Web 技术合作。 斯科特担任独立顾问、教练和作家。 他的最新书是《Sams 自学ASP.NET 2.0 24小时速成》。 可以通过 mitchell@4GuysFromRolla.com 联系到他。

特别致谢

本教程系列由许多有用的审阅者审阅。 本教程的主要审阅者是希尔顿·吉森诺。 有兴趣查看即将发布的 MSDN 文章? 如果是这样,请给我写信。mitchell@4GuysFromRolla.com