Reportviewer的子报表不起作用

时间:2016-04-18 19:50:06

标签: 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 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。检查日志文件以获取更多信息。

有人可以帮助我吗?

2 个答案:

答案 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页面呈现时,报告不会立即加载。它似乎等待一个计时器,几秒钟后,显示忙碌图标并继续处理报告(减去子报告)

如果我不能取得成功,可能会再看一眼,但可能需要采取另一种方式