RDLC 到 ReportViewer 的动态绑定






4.71/5 (21投票s)
本文演示了如何在运行时将 reportviewer 控件动态绑定到 Datasource。
引言
我一直在努力寻找将 rdlc 动态绑定到 reportviewer 的解决方案。我们有一个场景,我们将应用程序从 .NET 1.1 迁移到 .NET 2.0。迁移后,使用显式 objectdatasource 嵌入 reportviewer 带来了主要问题。每当我们尝试将数据集引用分配给 objectdatasource 时,IDE 就会毫无理由地突然关闭。这是我们在开发过程中遇到的一个 bug。我们搜索了很多,但很少有人遇到这个独特的问题,因此无法获得正确的解决方案。然后我们计划在运行时绑定 reportviewer,而无需使用 objectdatasource。以下是执行此操作的步骤。
设计架构

生产部署问题及其解决方案
在部署过程中,如果发布并创建了预编译的源代码,则必须格外小心地执行以下活动。
- 为部署创建预编译。
- 将预编译源代码中的 .RDLC 文件替换为原始的 *.rdlc 文件。其原因在于预编译会破坏 .rdlc 的内部代码结构。为了维护其模式和设计,我们建议您用原始的 rdlc 替换预编译的 rdlc。
先决条件
注意:在生产 Web 服务器中,我们安装了轻量级的 .net framework,因此 report viewer 不可用。因此,它将抛出 report viewer dlls 不存在。
单击此处安装 Reportviewer.exe。
问题陈述
有一个包含两个字段 customerid
和 customerName
的客户表。我们需要为 reportviewer 中的此数据表生成报告,而无需使用 objectdatasource
。
创建数据集架构
按照下面给出的步骤定义数据集架构,无需连接到任何数据源。这是一个手动过程。这需要将表的每一列一个接一个地添加,如下所示。
单击工具箱图标以继续。
如下所示将列添加到架构。
使用参数创建 Report RDLC
需要从工具箱中拖动表格到面板中以绘制表格部分作为报告的正文部分。完成后,单击“显示数据源”,将看到数据集架构部分,如下所示。将列拖到表格行中,就在标题部分下方。从主菜单中选择 Reportparameter 并添加一个到报告中。此参数值可以从 aspx 的表单传递到 Reportviewer 的 RDLC 面板。
在报告屏幕中拖动文本框,然后右键单击以选择其属性。
单击值字段的 Fx 按钮,将此文本框字段值与参数集字段变量关联起来。
在 Aspx 中嵌入 Report Viewer
将 Reportviewer 拖动到 aspx 设计页面中,并添加 RDLC 文件的本地路径。可以调用存储过程并获取数据库结果集,然后将其分配给 reportviewer。为了运行此演示的某个版本,我包含了硬编码的结果集。
private void BindReportViewer()
{
ReportViewer1.Visible = true;
//Invoke Stored procedure With Input parameter to it.
//DataSet dsReport = objSP.GetTable(storedProcedure,txtParameter.Text));
//Hardcoded Values.
IList >Customer< customerList = new List>Customer<();
customerList.Add(new Customer(1,"Santosh Poojari"));
customerList.Add(new Customer(2, "Santosh Poojari1"));
customerList.Add(new Customer(3, "Santosh Poojari2"));
ReportParameter[] param = new ReportParameter[1];
param[0] = new ReportParameter("Report_Parameter_0",txtParameter.Text);
ReportViewer1.LocalReport.SetParameters(param);
ReportDataSource rds = new ReportDataSource
("DataSet1_Customers_DataTable1", customerList);
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(rds);
ReportViewer1.LocalReport.Refresh();
}
以下是预期的输出。
结论
希望本文能帮助那些正在处理类似问题陈述的人。任何建议和意见都将帮助我提高本文的质量。
历史
- 首次发布 - 初稿:2008 年 12 月 11 日
- 更新生产部署问题及其解决方案:2008 年 12 月 19 日