我正在尝试将 Crystal Report Viewer 添加到 asp.net web 应用程序。我们正在使用为我们的桌面应用程序创建的报告,因此它们已经创建并可以正常运行。我们在两个平台上使用相同的查询连接到相同的数据库,并且数据库和查询是在报表设计器中设置的。
下面是 asp.net 项目中 Visual Studio Pro 2015 中的一份报告的预览:
我已将以下行添加到我的 Reports.aspx 页面:
<CR:CrystalReportViewer ID="crptViewer" runat="server" AutoDataBind="true" />
我在应用目录根目录下添加了一个“Crystalreportviewers13”文件夹,里面是水晶报表安装的内容
我已将以下内容添加到我的 web.config 文件中:
<configuration>
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReports">
<section name="rptBuildProvider" type="CrystalDecisions.Shared.RptBuildProviderHandler, CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, Custom=null"/>
<section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</sectionGroup>
</configSections>
<businessObjects>
<crystalReports>
<rptBuildProvider>
<add embedRptInResource="true"/>
</rptBuildProvider>
<crystalReportViewer>
<add key="ResourceUri" value="/crystalreportviewers13" />
</crystalReportViewer>
</crystalReports>
</businessObjects>
我已经根据不同的堆栈溢出建议对代码隐藏尝试了几种策略。到目前为止,这是我尝试过的:
点击按钮:
public partial class Reports : System.Web.UI.Page
{
ReportDocument rptDocument;
protected void Page_Load(object sender, EventArgs e)
{
string stack = "Page_Load()(Reports.aspx.cs)";
try
{
if (Session["report"] != null)
{
crptViewer.ReportSource = Session["report"];
}
}
catch (Exception EX)
{
IOClass.appendLog("Error in " + stack, EX.Message);
}
}
//Button Click
protected void generateReport(object sender, EventArgs e)
{
rptDocument = new ReportDocument();
rptDocument.Load(Server.MapPath("~/Crystal/UserListing.rpt"));
rptDocument.SetParameterValue("Company", 1);
Session["report"] = rptDocument;
}
}
和负载:
public partial class Reports : System.Web.UI.Page
{
ReportDocument rptDocument;
protected void Page_Load(object sender, EventArgs e)
{
string stack = "Page_Load()(Reports.aspx.cs)";
try
{
rptDocument = new ReportDocument();
rptDocument.Load(Server.MapPath("~\\Crystal\\UserListing.rpt"));
crptViewer.ReportSource = rptDocument;
//I have tried with and without the following:
//crptViewer.DataBind();
//and
//crptViewer.RefreshReport();
}
catch (Exception EX)
{
IOClass.appendLog("Error in " + stack, EX.Message);
}
}
}
在两种情况下加载页面时,这就是我得到的:
我正在对加载函数进行异常记录,但我没有得到任何异常。
知道我在这里做错了什么吗?如果我可以提供任何其他信息,请告诉我。
谢谢你的时间
在aspx上删除
<asp:Content>
并像这样使用默认的 html 页面...
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="myproject.WebForm1" %>
<%@ Register assembly="CrystalDecisions.Web, Version=13.0.3500.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="/crystalreportviewers13/js/crviewer/crv.js">
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnShowReport" runat="server" Text="Show Report" OnClick="btnShowReport_Click" />
<CR:CrystalReportViewer ID="JobRepairReportViewer" runat="server" AutoDataBind="true" />
</div>
</form>
</body>
</html>
在 aspx.cs 中加载
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Data;
using System.Diagnostics;
using CrystalDecisions.CrystalReports.Engine;
namespace iconequipment
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnShowReport_Click(object sender, EventArgs e)
{
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("JobRepairReport.rpt"));
//rpt.SetParameterValue("JobID", this.txtJobID.Text);
this.JobRepairReportViewer.ReportSource = rpt;
this.JobRepairReportViewer.RefreshReport();
}
}
}