我想坚持使用一个单一的表单和ReportViewer
控件,并在运行时分配各种报告和数据源。快速谷歌检查所揭示的多样化和复杂的解决方案促使我宁愿在这里问。我怎样才能做到这一点?
2 回答
您将需要一个具有 ReportViewer 控件、RDLC 报告和数据源的表单;可能有几种实现方式,但是您可以有一个“报告管理器”类公开方法,每个方法都显示一个特定的报告(例如ShowOrdersReport()
,ShowTimeSheetReport()
等) - 或者您可以定义一个基ReportBase
类,其Show()
方法实现提示需要时的参数......无论什么工作,它基本上可以归结为:
var reportForm = new ReportViewerForm(); // instantiate the form
// load the report definition into the viewer:
reportForm.reportViewer1.LocalReport.ReportEmbeddedResource = "Namespace.Report.rdlc";
// loading the data works great with a DataSet:
var data = _reportingDataSet.Tables[0];
// create the ReportDataSource with the report data:
var reportDataSource = new ReportDataSource("rdsReportDataSource", data);
reportForm.ShowReport(new[] { reportDataSource });
在这里,您将要注入_reportingDataSet
依赖项;如果您使用参数化存储过程,您将需要在填充数据集之前提示输入报告参数。
该ShowReport()
方法将数据源添加到LocalReport.DataSources
,然后调用RefreshReport()
它来显示您指定的报告。
public void ShowReport(IEnumerable<ReportDataSource> dataSources)
{
foreach (var dataSource in dataSources)
reportViewer1.LocalReport.DataSources.Add(dataSource);
reportViewer1.RefreshReport();
}
如果您使用的是 Crystal 报表,则在单击加载报表按钮 CrystalReportViewer.ReportSource = ReportName 时使用它
如果您使用的是 MS ReportViewer 控件,则需要两个重要步骤来显示报告
- 将报告文件路径分配给 ReportViewer
- 设置数据源
因此,例如名为 reportViewer1 的 ReportViewer 控件需要显示 SomeReport.rdlc 文件,然后需要以下代码(假设单击按钮)
this.reportViewer1.LocalReport.ReportPath = @"Add absolute path of rdlc file"//e.g. @"C:\SomeReport.rdlc" ;
this.reportViewer1.RefreshReport();
这只是一个简单的示例,为简单起见,如果您需要显示数据库中的数据,只需在调用 RefreshReport 之前分配数据源属性,例如
this.reportViewer1.LocalReport.DataSources.Add(MyreportDataSource);
其中 MyreportDataSource 是 ReportDataSource 类型的对象,您可以轻松地将任何 ADO.net DataTable 转换为 ReportDataSource 对象。
我希望这些信息对您有所帮助,如果您想查看更多详细信息,您可以在此位置参考一篇非常好的文章