|
|
2
ben
15 年前
我们能够让报表查看器正常工作,并且在过去几个月的生产中一直在使用它,没有出现任何问题。
-
我们有一个报告控制器,它列出了指向要运行的报告的链接
-
单击其中一个链接将对后端进行ajax调用,并返回一个部分页面,在该页面中我们可以填写所需的所有参数。
-
填写完参数后,我们将表单提交到“\reports\Name of Report”。
-
回到报表控制器中,我们调用SQL,返回数据,然后调用另一个称为“完整报表”的视图
-
“完整报告”视图上只有一个crystal Report viewer控件,它自动获取我们通过ViewData传递给它的报告数据,填充报告,呈现报告,并将其发送给用户
我在上面最初列出的步骤中添加了一些代码和说明。我遗漏的关键一点是最终视图中有一些代码,因此它将与Crystal Reports一起工作。隐藏的代码很少,但需要。要使Crystal Reports正常工作,您将得到以下文件:
-
设计报告的布局文件.rpt
-
保存Crystal Reports控件的aspx文件。这是将有一些代码隐藏的文件。
有关如何创建可用于Crystal Reports的视图的详细信息:
-
使用Crystal Reports Designer创建报告的布局。生成的文件将是一个.rpt文件。在本例中,我们将此文件称为AllJobsSummaryReportLayout.rpt。
-
在设计报表时,为“数据库字段”选择一个业务实体或DTO,该实体或DTO保存从SQL返回的结果。
-
简单地说,我们的系统中有一些数据传输对象(DTO),它们只包含标量值和字符串,这些DTO中没有智能。当控制器被调用时,它调用模型,大多数报告的模型返回一个DTO列表,然后我们将其传递给要呈现的视图。这些DTO不知道如何查询自己、显示自己,它们只包含其他人随后呈现的SQL返回的实际值。
-
完成布局水晶报告文件AllJobsSummaryReportLayout.rpt后,我们设计控制器。在控制器中,我们获取运行报告所需的任何参数,调用模型,模型返回DTO列表,如下面控制器的代码段所示:
var reportViewData = model.AllJobsSummaryQuery(startDate, endDate);
if (0 != reportViewData.Count())
{
var report = new AllJobsSummaryReportLayout();
report.SetDataSource(reportViewData);
report.SetParameterValue("startDate", startDate);
report.SetParameterValue("endDate", endDate);
ViewData["ReportData"] = report;
returnView = "AllJobsSummaryView";
}
else
returnView = "noReportView";
return View(returnView);
-
注意这里有几个项目,我们正在创建一个可变的“报告”,它是我们在上面创建的Crystal报告布局文件AllJobsSummaryReportLayout.rpt的一种类型。
-
-
现在让我们来看一看ALOJOSSReMyVIEW.ASPX。此文件上有一个带有Crystal Reports Viewer和代码隐藏文件的表单:
<%@ Page Title="All Jobs Summary Report" Language="C#" AutoEventWireup="true" CodeBehind="AllJobsSummaryView.aspx.cs" Inherits="V.Views.Reports.AllJobsSummaryView"%>
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<form id="form1" runat="server">
<div>
<a href="/Reports" id="Report"><< Return to Report Main
Page</a><br />
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="True" EnableDatabaseLogonPrompt="False"
EnableParameterPrompt="False" HasCrystalLogo="False" DisplayGroupTree="False"
HasDrillUpButton="False" HasToggleGroupTreeButton="False" HasViewList="False"
HasSearchButton="False" EnableDrillDown="False" EnableViewState="True"
Height="50px" ReportSourceID="CrystalReportSource1" Width="350px" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="AllJobsSummaryReportLayout.rpt">
</Report>
</CR:CrystalReportSource>
</div>
</form>
-
和代码隐藏文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace V.Views.Reports
{
public partial class AllJobsSummaryView : ViewPage
{
protected void Page_Init(object sender, EventArgs e)
{
ReportViewer.ReportSource = ViewData["ReportData"];
}
protected void Page_Unload(object sender, EventArgs e)
{
((AllJobsSummaryReportLayout)ViewData["ReportData"]).Close();
((AllJobsSummaryReportLayout)ViewData["ReportData"]).Dispose();
}
}
}
-
页面_Unload是键,如果没有它,Crystal Reports将生成一个错误“您已超过管理员设置的最大报告数”
这种方法在生产环境中仍然有效两年多了。
|