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);
        }
    }
}