循环显示多个 Crystal 报告

Show Multiple Crystal Reports in Loop

我在复选框列表中有多个 Crystal 报告,因此用户可以同时 print/show 多个报告。

目前我正在使用会话来传递报告文档,但大多数时候会话值在分配给 crystal 报告之前会被替换,因此多个报告包含相同的数据。我在每个循环上应用了 3 秒延迟,但不是可靠的解决方案。而且图像也没有显示在报告中。

有什么优雅的技巧可以做到这一点吗??

Session 变量的替代方案是什么?

Jquery:

$.each(chkBoxarr, function (index, value) {
 var w = window.open();
                $.ajax({
                    type: "POST",
                    url: "PrintReports",
                    traditional: true,
                    data: { id: value},
                    datatype: "json",
                    success: function (data) {
                        w.document.write(data);
                    },
                    error: function () {
                        alert("Error");
                    }
                });
});

控制器:

public ActionResult PrintReports(id)
{
  ReportDocument rpt = new ReportDocument();
  rpt.Load("~/ReportFileName.rpt");
  HttpContext.Session["rpt"] = rpt;
  return Redirect("~/Viewer.aspx");
}

Viewer.aspx.cs

Page_Init(object sender, EventArgs e)
{
    var rpt = System.Web.HttpContext.Current.Session["rpt"];
    CrystalReportViewer1.ReportSource = (ReportDocument)rpt;
}

Javascript:

$.each(chkBoxarr, function (index, value) {
    $.ajax({
        url: "PrintReports",
        type: 'GET',
         data: { id: value},
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (data) {
            if (data.success) {
                var URL = 'Viewer.aspx?type=' + data.URL;
                window.open(URL);
            }
            else {
                alert(data.message);
            }
        }
    });
});

控制器:

public ActionResult PrintReports(id)
{
    ReportDocument rpt = new ReportDocument();
    rpt.Load("~/ReportFileName.rpt");
    string guid = Guid.NewGuid().ToString();
    Session[guid] = rpt;
    return Json(new { success = true, URL = guid }, JsonRequestBehavior.AllowGet);
}

Viewer.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    ReportName = Request.QueryString["type"].ToString();
    ReportDocument doc = new ReportDocument();
    doc = (ReportDocument)Session[ReportName];
    if (doc == null)
        Response.Write("<H2>Nothing Found; No Report name found</H2>");
    CrystalReportViewer1.ReportSource = doc;
}

没有会话:

$.each(chkBoxarr, function (index, value) {    
  var URL = 'Viewer.aspx?id=' + value;
  window.open(URL);            
});

protected void Page_Load(object sender, EventArgs e)
{
   ReportDocument rpt = new ReportDocument();
   rpt.Load("~/ReportFileName.rpt");         
   CrystalReportViewer1.ReportSource = rpt;
}

为了显示图像,在存在 Viewer.aspx 的文件夹中添加一个 aspx 文件 CrystalImageHandler.aspx。 还添加

 <httpHandlers>
      <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>

    </httpHandlers>

在 Weconfig 中...版本号因您的 crystalreport 版本而异