我想在主报表中设置子报表,但是我的子报表数据集有问题。我的主要报告的行动。
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();
}
我的子报告的动作:
private void RenderizaSubRelatorioPedido(object sender, SubreportProcessingEventArgs e)
{
int idEmpresa = Convert.ToInt32("2");
e.DataSources.Add(new ReportDataSource("empresa",
_appServicoEmpresa.ObterEntidadePor(i => i.Id == idEmpresa)));
}
错误:
子报告的失败数据恢复&#39; subreport1&#39; ,位于:C:\ Projects \ Samich \ VisualStudioOnLine \ Vanessa \ Samich Projects C#\ EMS - 审计管理系统 - 复制\ EMS - 审计管理系统\ Report \ ReportHeader.rdlc。检查日志文件以获取更多信息。
有人可以帮助我吗?
答案 0 :(得分:2)
找到解决方案
ASPX表格&#34; ReportViewerWebForm.aspx&#34;由NuGet添加到项目中。这是从MVC视图调用以呈现报告。编辑此页面可以调用子报告过程。
ReportViewerWebForm.aspx没有代码隐藏页面,但是继承自一个类&#34; ReportViewerForMvc.ReportViewerWebForm&#34;在幕后操作。
我添加了一个页面类文件&#34; ReportViewerWebForm.aspx.cs&#34; (以及设计器文件&#34; ReportViewerWebForm.aspx.designer.cs&#34;为了完整性)并将ASPX页面更改为从代码隐藏类继承。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReportViewerWebForm.aspx.cs" Inherits="YourNamespace.ReportViewerWebForm" %>
我更新了代码隐藏,以便页面类继承自&#34; ReportViewerForMvc.ReportViewerWebForm&#34;并为On_Load创建了一个覆盖,以连接子报告处理事件。在此事件处理程序中,数据被添加到子报告
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);
}
}
}
如果您只有一个报告,这可以正常工作,但为了支持多个报告,您需要知道每种情况下要提供哪些数据。在短期内,我将在&#34; Reportviewer1.LocalReport.DisplayName&#34;中设置一个唯一的名称。因为我只有一些报告需要支持。
答案 1 :(得分:0)
我遇到与上述相同的问题 - 这是我迄今为止尝试过的问题
现有的Windows应用程序(我正在迁移到MVC)具有RDLC报告,这些报告在Windows Report Viewer控件中呈现为OK。
将代码移植到MVC会出现上述子报告的问题。无法找到问题的任何日志或其他指针,只有关于无法呈现子报告的消息。
我使用以下查看器
@using ReportViewerForMvc;
子报告数据将添加到处理事件
中rpt.SubreportProcessing += LocalReport_SubreportProcessing;
在MVC版本中,从不在Controller中调用上述事件。
在另一次解决这个问题的尝试中,我将C#移动到CSHTML页面上的代码块,并将事件和其他方法包装在委托和Action块中,但是遇到了同样的问题。
rpt.SubreportProcessing += (object sender, SubreportProcessingEventArgs e) =>
{
...
我不知道报告进程在哪里运行,但是在Controller或CSHTML代码中都没有调用任何控件事件处理程序。
如果在Controller中将报表呈现为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页面设计器中,控件有一条错误消息,指出它无法创建(并且工具箱中没有报表查看器控件)
<%@ 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>
到目前为止,没有运气
我注意到当MVC页面呈现时,报告不会立即加载。它似乎等待一个计时器,几秒钟后,显示忙碌图标并继续处理报告(减去子报告)
如果我不能取得成功,可能会再看一眼,但可能需要采取另一种方式