C# 带有Reportviewer的子报表不';行不通
我想在主报表中设置一个子报表,但我的子报表数据集有问题。我的主要报告的行动C# 带有Reportviewer的子报表不';行不通,c#,asp.net-mvc,reportviewer,subreport,C#,Asp.net Mvc,Reportviewer,Subreport,我想在主报表中设置一个子报表,但我的子报表数据集有问题。我的主要报告的行动 public ActionResult ExibirRelatorioProgramaSol(FormCollection form) { DateTime dtInicial = DateTime.Parse(form["dt_inicio"]); DateTime dtFinal = DateTime.Parse(form["dt_fim"]); int i
public ActionResult ExibirRelatorioProgramaSol(FormCollection form)
{
DateTime dtInicial = DateTime.Parse(form["dt_inicio"]);
DateTime dtFinal = DateTime.Parse(form["dt_fim"]);
int idLista = form["ddl_Lista"].ConvertValueForm<int>();
var avaliacao = _appServicoAvaliacaoSetor.ObterAvaliacoes(dtInicial, dtFinal, idLista);
var relatorio = _appServicoAvaliacaoSetor.GerarRelatorioProgramaSol(dtInicial, dtFinal, idLista);
var viewer = new Microsoft.Reporting.WebForms.ReportViewer();
viewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Local;
viewer.LocalReport.ReportPath = Request.MapPath(Request.ApplicationPath) + "/Report/ReportProgramaSol.rdlc";
viewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(RenderizaSubRelatorioPedido);
viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("ProgramaSol", relatorio.ToList()));
viewer.SizeToReportContent = true;
viewer.Width = System.Web.UI.WebControls.Unit.Percentage(100);
viewer.Height = System.Web.UI.WebControls.Unit.Percentage(100);
ViewBag.ReportViewer = viewer;
return View();
}
错误:
子报表“subreport1”的故障数据恢复,位于:C:\Projects\Samich\VisualStudioOnLine\Vanessa\Samich Projects C\#\EMS-审计管理系统-副本\EMS-审计管理系统\report\ReportHeader.rdlc。有关详细信息,请查看日志文件
有人能帮我吗?我遇到了与上面相同的问题-以下是我迄今为止所尝试的 现有的Windows应用程序(我正在迁移到MVC)具有RDLC报告,这些报告在Windows报告查看器控件中呈现OK 将代码移植到MVC会出现上述子报告的问题。找不到任何日志或指向该问题的其他指针,只有关于无法呈现子报表的消息 我正在使用以下查看器
@using ReportViewerForMvc;
子报表数据将添加到处理事件中
rpt.SubreportProcessing += LocalReport_SubreportProcessing;
在MVC版本中,控制器中从未调用上述事件
在解决这个问题的另一次尝试中,我将C#移动到CSHTML页面上的一个代码块,并将事件和其他方法包装在委托和操作块中,但遇到了同样的问题
rpt.SubreportProcessing += (object sender, SubreportProcessingEventArgs e) =>
{
...
我不知道报表进程在哪里运行,但在控制器或CSHTML代码中都没有调用任何控件事件处理程序
如果在控制器中将报表渲染为PDF而不是返回视图,则会正确创建报表并在浏览器中显示PDF
Warning[] warnings;
string mimeType;
string[] streamids;
string encoding;
string filenameExtension;
var bytes = rpt.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
return new System.Web.Mvc.FileContentResult(bytes, mimeType);
我还创建了一个单独的APSX页面,该页面运行与Windows版本相同的代码,该版本调用子报表事件处理程序,似乎处理了所有必需的数据。但是,报告查看器中不显示任何报告(尽管它说只有一个页面)。在ASPX页面设计器中,该控件有一条错误消息,表示无法创建该控件(并且工具箱中没有报表查看器控件)
到目前为止,没有运气
我注意到当MVC页面呈现时,报告不会立即加载。它似乎在等待计时器,几秒钟后,显示忙碌图标并继续处理报告(减去子报告)
将对此进行另一次检查,但如果我无法获得成功,则可能不得不另辟蹊径找到解决方案 NuGet将ASPX表单“ReportViewerWebForm.ASPX”添加到项目中。这是从MVC视图调用的,用于呈现报告。编辑此页面允许调用子报告流程 ReportViewerWebForm.aspx没有代码隐藏页,但继承了在后台运行的类“ReportViewerWebForm.ReportViewerWebForm” 我添加了一个页面类文件“ReportViewerWebForm.aspx.cs”(为了完整起见,还添加了设计器文件“ReportViewerWebForm.aspx.designer.cs”),并将aspx页面更改为从代码隐藏类继承
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReportViewerWebForm.aspx.cs" Inherits="YourNamespace.ReportViewerWebForm" %>
如果您只有一个报表,那么这很好,但是为了支持多个报表,您需要知道在每种情况下提供哪些数据。短期内,我将在“Reportviewer1.LocalReport.DisplayName”中设置一个唯一的名称,因为我只支持几个报告。Ah子报告……它们产生的有用错误消息非常少。我做过的一件事是从一个完全干净的子报告开始(例如,没有数据源/参数或任何东西),然后慢慢地…非常缓慢地…添加不同的部分。从参数开始…您需要绑定设计器中的参数,它们可能来自外部报告。然后添加一个数据源。看看什么东西死了,然后从那里走。我尝试了所有的方法,但没有任何效果。我真的需要帮助=(这对我来说很有效!重申一下,这在使用NuGet package ReportViewPerformVC时有效。要知道要添加到子报表中的数据源,可以打开
子报表ProcessingEventArgs.ReportPath
参数。那么发生了什么,您必须选择哪条路径?最后我将RDLC报表转换为简单的表格式在MVC中输出HTML视图,并使用PDF转换器供用户下载报告。在过去18个月内工作得非常好。人们通常不会使用HTML中的表格布局,尽管您可以向用户显示这样一个只读页面,但最终我选择只下载一个PDF,它从表格布局中转换比从DIV和CSS中转换更一致
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Reports.aspx.cs" Inherits="Cass3Web.Reports" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Assembly="ReportViewerForMvc" Name="ReportViewerForMvc.Scripts.PostMessage.js" />
</Scripts>
</asp:ScriptManager>
<div style="height: 600px; width: 900px; border: 1px solid silver;">
<rsweb:ReportViewer ID="rv" runat="server" Height="600" Width="900" AsyncRendering="false"></rsweb:ReportViewer>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReportViewerWebForm.aspx.cs" Inherits="YourNamespace.ReportViewerWebForm" %>
using Microsoft.Reporting.WebForms;
namespace YourNamespace
{
public partial class ReportViewerWebForm : ReportViewerForMvc.ReportViewerWebForm
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ReportViewer1.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
}
private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
ReportDataSource rds = new ReportDataSource("SubReport_DatasetName_Here", yourData);
e.DataSources.Add(rds);
}
}
}