第 8 课:创建数据筛选器
在父报表上添加钻取操作后,接下来将创建一个数据筛选器,用于为子报表定义的数据表。
可创建基于表的筛选器或查询筛选器用于钻取报表。 本课对这两种选择均加以说明。
基于表的筛选器
需要完成以下任务才能实现基于表的筛选器。
向子报表中的 tablix 添加一个筛选表达式。
创建一个函数,用于从 PurchaseOrderDetail 表选择未筛选的数据。
添加一个事件处理程序,用于将 PurchaseOrderDetail DataTable 绑定到子报表。
向子报表中的 tablix 添加一个筛选表达式
打开子报表。
选择 tablix 中的某个列标题,右键单击显示在该列标题上方的灰色单元格,然后单击**“Tablix 属性”**。
单击**“筛选器”页,然后单击“添加”**。
在**“表达式”字段中,从下拉列表中单击“ProductID”**。 筛选器即应用于此列。
在**“运算符”下拉列表中单击等号 (=**) 运算符。
单击**“值”字段旁的表达式按钮,在“类别”区域中单击“参数”,然后在“值”区域中双击“productid”**。 **“为以下项设置表达式: 值”**字段现在应包含类似于 =Parameters!productid.Value 的表达式。
单击**“确定”,然后在“Tablix 属性”对话框中再次单击“确定”**。
保存 .rdlc 文件。
创建一个函数,用于从 PurchaseOrderDetail 表选择未筛选的数据
在解决方案资源管理器中,展开 Default.aspx,然后双击 Default.aspx.cs。
创建一个新函数,该函数接受类型为 Integer 的参数 productid 并返回 datatable 对象,然后执行以下操作。
创建数据集 DataSet2(在第 4 课:定义用于子报表的数据连接和数据表 的第 2 步中创建)的一个实例。
创建与 SQL Server 数据库的连接以执行在第 4 课:定义用于子报表的数据连接和 DataTable 中定义的查询。
该查询将返回未筛选的数据。
通过执行该查询,用未筛选的数据填充 DataSet 实例。
返回 PurchaseOrderDetail DataTable。
该函数将类似于下面这个函数(仅供参考。 可采用您所需的任意模式提取子报表所需的数据。)
务必包括对 System.Data 和 System.Data.SqlClient 命名空间的引用。
/// <summary> /// Function to query PurchaseOrderDetail table, fetch the /// unfiltered data and bind it with the Child report /// </summary> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail() { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Adventureworks;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail ", sqlconn); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
添加一个事件处理程序,用于将 PurchaseOrderDetail DataTable 绑定到子报表
打开 Default.aspx。
右键单击 ReportViewer 控件,然后单击**“属性”**。
在**“属性”页上,单击“事件”**图标。
双击**“钻取”**事件。
随后将在代码中添加一个事件处理程序部分,类似于下面这个代码块。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
将事件处理程序填写完整。 它应包括以下功能。
从 DrillthroughEventArgs 参数提取子报表对象引用。
调用函数 GetPurchaseOrderDetail
将 PurchaseOrderDetail DataTable 与报表的相应数据源绑定。
填写完整的事件处理程序代码将类似于以下内容。
务必包括对 Microsoft.Reporting.WebForms 命名空间的引用。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Get the instance of the Target report, in our case the JumpReport.rdlc. LocalReport report = (LocalReport)e.Report; //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail())); } catch (Exception ex) { Response.Write(ex.Message); } }
保存该文件。
查询筛选器
需要完成以下任务才能实现查询筛选器。
创建一个函数,用于从 PurchaseOrderDetail 表选择经过筛选的数据。
添加一个事件处理程序,用于检索参数值并将 PurchaseOrdeDetail DataTable 绑定到子报表。
创建一个函数,用于从 PurchaseOrderDetail 表选择经过筛选的数据
在解决方案资源管理器中,展开 Default.aspx,然后双击 Default.aspx.cs。
创建一个新函数,该函数接受类型为 Integer 的参数 productid 并返回 datatable 对象,然后执行以下操作。
创建数据集 DataSet2(在第 4 课:定义用于子报表的数据连接和数据表 的第 2 步中创建)的一个实例。
创建与 SQL Server 数据库的连接以执行在第 4 课:定义用于子报表的数据连接和 DataTable 中定义的查询。
该查询将包括参数 productid 以确保根据在父报表中选择的 ProductID 筛选所返回的数据。
通过执行该查询,用经过筛选的数据填充 DataSet 实例。
返回 PurchaseOrderDetail DataTable。
该函数将类似于下面这个函数(仅供参考。 可采用您所需的任意模式提取子报表所需的数据。)
务必包括对 System.Data 和 System.Data.SqlClient 命名空间的引用。
/// <summary> /// Function to query PurchaseOrderDetail table and filter the /// data for a specific ProductID selected in the Parent report. /// </summary> /// <param name="productid">Parameter passed from the Parent report to filter data.</param> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail(int productid) { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Adventureworks;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail where ProductID = " + productid, sqlconn); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
添加一个事件处理程序,用于检索参数值并将 PurchaseOrdeDetail DataTable 绑定到子报表
打开 Default.aspx。
右键单击 ReportViewer 控件,然后单击**“属性”**。
在**“属性”窗格上,单击“事件”**图标。
双击**“钻取”**事件。
随后将在代码中添加一个事件处理程序部分,类似于以下内容。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
将事件处理程序填写完整。 它应包括以下功能。
从 DrillthroughEventArgs 参数提取子报表对象引用。
从所提取的子报表对象获取子报表参数列表。
遍历参数集合并检索从父报表传递的参数 ProductID 的值。
调用函数 GetPurchaseOrderDetail 并传递参数 ProductID 的值。
将 PurchaseOrderDetail DataTable 与报表的相应数据源绑定。
填写完整的事件处理程序代码将类似于以下内容。
务必包括对 Microsoft.Reporting.WebForms 命名空间的引用。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Variable to store the parameter value passed from the MainReport. int productid = 0; //Get the instance of the Target report, in our case the JumpReport.rdlc. LocalReport report = (LocalReport)e.Report; //Get all the parameters passed from the main report to the target report. //OriginalParametersToDrillthrough actually returns a Generic list of //type ReportParameter. IList<ReportParameter> list = report.OriginalParametersToDrillthrough; //Parse through each parameters to fetch the values passed along with them. foreach (ReportParameter param in list) { //Since we know the report has only one parameter and it is not a multivalued, //we can directly fetch the first value from the Values array. productid = Convert.ToInt32(param.Values[0].ToString()); } //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail(productid))); } catch (Exception ex) { Response.Write(ex.Message); } }
保存该文件。
下一个任务
您已成功创建了一个数据筛选器,用于为子报表定义的数据表。 接下来,将生成并运行网站应用程序。 请参阅第 9 课:生成并运行应用程序。