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

作者 :Scott Mitchell

下载 PDF

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

简介

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

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

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

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

图 1:调用 ObjectDataSource 的 SelectedSelecting 在其基础对象的 方法之前和之后触发的事件 (单击以查看全尺寸图像)

在本教程中,我们将介绍如何向 DAL 和 BLL 添加一个方法,该方法接受类型的int单个输入参数 Month,并返回一个EmployeesDataTable对象,该对象由在指定的 Month中具有招聘周年纪念日的员工填充。 我们的示例将基于当前月份以编程方式设置此参数,并显示“本月员工周年纪念日”列表。

现在就开始吧!

步骤 1:将方法添加到EmployeesTableAdapter

对于我们的第一个示例,我们需要添加一种方法来检索那些在指定月份发生的员工 HireDate 。 若要根据体系结构提供此功能,我们需要首先在 中创建 EmployeesTableAdapter 一个映射到正确 SQL 语句的方法。 为此,请首先打开 Northwind 类型化数据集。 右键单击标签, EmployeesTableAdapter 然后选择“添加查询”。

向 EmployeesTableAdapter 添加新查询

图 2:向 (添加新查询 EmployeesTableAdapter单击以查看全尺寸图像)

选择添加返回行的 SQL 语句。 到达“指定SELECT语句”屏幕时,将加载 的默认SELECTEmployeesTableAdapter语句。 只需在 子句中添加 WHEREWHERE DATEPART(m, HireDate) = @MonthDATEPART 是一个 T-SQL 函数,它返回某 datetime 类型的特定日期部分;在本例中,我们使用 DATEPART 来返回列的 HireDate 月份。

仅返回 HireDate 列小于或等于 <span class=@HiredBeforeDate Parameter“ />

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

最后,将 FillByGetDataBy 方法名称分别更改为 FillByHiredDateMonthGetEmployeesByHiredDateMonth

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

图 4:选择“比 FillBy ”更合适的方法名称“, GetDataBy (单击以查看全尺寸图像)

单击“完成”完成向导并返回到数据集的设计图面。 EmployeesTableAdapter现在应包含一组新的方法,用于访问在指定月份雇用的员工。

新方法显示在数据集的设计图面中

图 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.aspxBasicReporting 并添加新的 ObjectDataSource 作为其数据源。 将 ObjectDataSource 配置为使用 类,EmployeesBLLSelectMethod并将 设置为 GetEmployeesByHiredDateMonth(month)

使用 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 文本框中,或键入要使用的事件处理程序的名称。

单击“属性”窗口中的 Lightning Bolt 图标以列出 Web 控件的事件

图 9:单击“属性”窗口中的 Lightning Bolt 图标以列出 Web 控件的事件

这两种方法都向页面的代码隐藏类添加 ObjectDataSource Selecting 事件的新事件处理程序。 在此事件处理程序中,我们可以使用 读取和写入参数值e.InputParameters[parameterName],其中 parameterName 是 标记中 <asp:Parameter> 属性的值Name, (InputParameters 集合也可以按顺序编制索引,如 e.InputParameters[index]) 。 若要将 month 参数设置为当前月份,请将以下内容添加到 Selecting 事件处理程序:

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

通过浏览器访问此页面时,我们可以看到,本月 (3月) 劳拉·卡拉汉(Laura Callahan)雇佣了一名员工,他自 1994 年以来一直在公司工作。

显示本月周年纪念日的员工

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

总结

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

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

编程愉快!

关于作者

Scott Mitchell 是七本 ASP/ASP.NET 书籍的作者, 4GuysFromRolla.com 的创始人,自 1998 年以来一直从事 Microsoft Web 技术工作。 Scott 担任独立顾问、培训师和作家。 他的最新书是 山姆斯在24小时内 ASP.NET 2.0自学。 可以在 上联系 mitchell@4GuysFromRolla.com他, 也可以通过他的博客联系到他,该博客可在 http://ScottOnWriting.NET中找到。

特别感谢

本教程系列由许多有用的审阅者查看。 本教程的首席审阅者是希尔顿·吉森诺。 有兴趣查看我即将发布的 MSDN 文章? 如果是,请在 处放置一行 mitchell@4GuysFromRolla.com。