我有一个使用MVCReportViewer加载报告的MVC4应用程序,但子报告未加载并返回此错误:
Data retrieval failed for the subreport, 'Actions',
located at: C:\Projects\Report\ReportActions.rdlc.
Please check the log files for more information.
这是我的观看代码:
@using Microsoft.Reporting.WebForms;
@using MvcReportViewer;
@using MvcReportViewer
@model ViewReport
@Html.MvcReportViewerFluent(Model.ReportPathTordlc).ProcessingMode(ProcessingMode.Local).LocalDataSource(Model.ReportDataSet, Model.Report).LocalDataSource(Model.ActionDataSet, Model.Actions).Attributes(new { Height = 900, Width = 800, style = "border: 2px solid #ddd" }).Method(FormMethod.Post);
两个.rdlc文件的路径都是正确的,因为我在加载视图之前在控制器上检查它。
reportPathTordlc显示正确, 我有一个要检查的参数,所以在我的report.rdlc中我插入了带参数的子报表。在子报表上,我创建了一个参数。但仍未显示子报告。
在C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles
的日志文件中,如果没有显示任何错误,则只显示以下内容:i INFO: Call to CleanBatch()
。
到处搜索,但还没有运气。
来自here
的项目任何帮助都将不胜感激。
答案 0 :(得分:0)
经过大量研究,我终于找到了解决方案:
它不是最优雅的方式,但工作正常。
所以要完成:
在控制器中:
// Init new DataTable
DataTable dt = new DataTable();
// Assign the data for Subreport
dt = dataToLoadInSubReport();
// Place it in Session
Session["dataToLoadInSubReport"] = dt;
在视图中:
// Remove the subreport .LocalDataSource, keep the Parent Report
@Html.MvcReportViewerFluent("~/Report/report.rdlc").ProcessingMode(ProcessingMode.Local).LocalDataSource("ReportDataSet", ReportDataTable).Method(FormMethod.Post);
在MvcReportViewer中:
// Html head (Added the script below)
<script runat="server">
void SubSubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
// Check if Session is not null
if (Session["dataToLoadInSubReport"] != null)
{
// Get data in Session
System.Data.DataTable dt = Session["dataToLoadInSubReport"] as System.Data.DataTable;
// Convert to dataview to filter
System.Data.DataView dv = new System.Data.DataView(dt);
if (dv != null)
{
// Get Subreport parameter
var param1 = Convert.ToInt32(e.Parameters[0].Values[0]);
// Filter DataView
dv.RowFilter = "ID = " + param1;
// Add Filtered DataView to DataSource specified in the Subreport rdlc file
e.DataSources.Add(new ReportDataSource("DTSubReport", dv));
}
}
}
protected void ReportViewer_PreRender(object sender, EventArgs e)
{
ReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubSubreportProcessing);
}
</script>
//Html body (add new attribute OnPreRender="")
<rsweb:ReportViewer ID="ReportViewer" ClientIDMode="Predictable" runat="server" OnPreRender="ReportViewer_PreRender"></rsweb:ReportViewer>
父级应该按照MVCReportViewer中的描述工作,这是为了使子报告工作在一起。
希望这能帮到那里的人。
干杯