使用 SqlDataSource 控件将参数绑定到 Crystal Report——一种简化的代码方法






2.48/5 (10投票s)
2007年8月17日
2分钟阅读

53288

446
Crystal Reports 中参数绑定的简化代码方法
源代码: ASPNET_20_SampleProjects.zip
引言
互联网上有许多关于使用 CrystalReportViewer、CrystalReportSource 和 Crystal Report 设计器进行数据绑定的文章。 一些示例使用了简化的代码方法,而另一些示例则展示了如何使用 CR 对象模型来执行相同的操作。 我展示了一种简化的代码方法,将 UI 元素绑定到 CrystalReportViewer,以使用 SqlDataSource 控件显示底层报表。
背景
要创建一个 Crystal Report,该报表使用来自数据库的数据,并使用表示层 UI 元素中的过滤值,我们可以使用以下方法
- 使用数据库中的存储过程创建 CR; 在 ASPX 页面的代码隐藏中创建一个 datatable,该页面使用 CrystalReportViewer 控件显示 CR,并将 datatable 绑定到报表。
- 使用数据库中的存储过程创建 CR; 使用报表对象模型中的 parameters 集合,以编程方式将报表参数绑定到 UI 元素的值。
- 将参数绑定到 CR 的另一种方法是使用 SqlDataSource 控件作为底层报表的数据源的简化代码方法。
Using the Code
为了演示这种方法,我们将使用 Northwind 数据库附带的 CustOrderHist 存储过程。
创建一个新的 CR 以使用 CustOrderHist 存储过程显示数据。
- 在 Visual Studio 2005 中创建 CustOrderHistory.rpt,并在创建新的数据库连接后按照向导选择 CustOrderHist 存储过程。
- 选择 ProductName 和 Total 作为要显示的报表字段。
创建一个 ASPX 页面并将 CrystalReportViewer 控件绑定到 Crystal Report
- 将 SqlDataSource 控件拖放到 ASPX 页面上,切换到页面设计器并使用智能标记配置数据源。 在步骤 1 和 2 之后,您将看到生成的标记如下所示
- 使用查询生成器并从 Customers 表中选择 CustomerID 和 CompanyName 列。
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT [CustomerID], [CompanyName] FROM [Customers]" SelectCommandType="Text"> </asp:SqlDataSource>
- 将 DropDownList 控件拖放到 ASPX 页面上,切换到页面设计器并使用智能标记选择在上一步中创建的 SqlDataSource 作为数据源。 选择 CustomerID 作为 DataValueField,CompanyName 作为 DataTextField。
在步骤 3 之后,您将看到生成的标记如下所示。
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="CompanyName" DataValueField="CustomerID" AppendDataBoundItems="true"> <asp:ListItem Text="-- Customer Order History --" Value="NULL" /> </asp:DropDownList>
- 拖放 CrystalReportSource 控件和 CrystalReportViewer 控件,切换到页面设计器并配置 CRS 以选择 CustOrderHistory.rpt 作为报表源。 然后配置 CRV 以选择创建的 CrystalReportSource1 控件作为报表源。
- 打开 CrystalReportSource1 控件的属性窗口,然后选择 SqlDataSource1 控件作为数据源之一。 在步骤 4 和 5 之后,您将看到生成的标记如下所示。
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" ReuseParameterValuesOnRefresh="True" DisplayGroupTree="False" ReportSourceID="CrystalReportSource1" /> <CR:CrystalReportSource ID="CrystalReportSource1" runat="server" OnDataBinding="CrystalReportSource1_DataBinding" OnInit="CrystalReportSource1_Init" OnLoad="CrystalReportSource1_Load" OnPreRender="CrystalReportSource1_PreRender" OnUnload="CrystalReportSource1_Unload"> <Report FileName="Reports\CustOrderHistory.rpt"> <DataSources> <CR:DataSourceRef DataSourceID="SqlDataSource2" TableName="CustOrderHist;1" /> </DataSources> </Report> </CR:CrystalReportSource> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="CustOrderHist" SelectCommandType="StoredProcedure" OnSelecting="SqlDataSource2_Selecting"> <SelectParameters> <asp:ControlParameter ControlID="DropDownList1" Name="CustomerID" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource>
- 进入代码隐藏文件和 ASPX 页面并添加以下代码。
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Enterprise; using CrystalDecisions.ReportSource; using CrystalDecisions.Shared; using CrystalDecisions.Web; public partial class CRParameters : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e) { if (Page.IsPostBack == false) { e.Command.Parameters["@CustomerID"].Value = DBNull.Value; } }