2015-07-21 5 views
9

Ich habe mehrere Crystal Reports in Checkboxlist, so dass Benutzer mehrere Berichte gleichzeitig drucken/anzeigen können.Zeigen mehrere Crystal Reports in Schleife

Momentan verwende ich Sitzung, um das Berichtsdokument zu übergeben, aber die meiste Zeit wird der Sitzungswert ersetzt, bevor dem Crystal Report zugewiesen wird. Daher enthalten mehrere Berichte dieselben Daten. Ich habe auf jede Schleife eine Verzögerung von 3 Sekunden angewendet, aber keine zuverlässige Lösung. Und auch Bild wird nicht in Berichten angezeigt.

Gibt es eine elegante Technik, dies zu tun?

Oder

Was wird für die Variable Session alternativ sein?

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

Controller:

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

Antwort

1

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

Controller:

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

Ohne Sitzungen:

$.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; 
} 

Für hinzufügen angezeigte Bild eine aspx Datei Crysta lImageHandler.aspx in einem Ordner, in dem Viewer.aspx vorhanden ist. fügen auch

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

    </httpHandlers> 

in Weconfig ... Versionsnummer

+0

Vielen Dank für Ihre Anregung hängt von Ihrer Crystal Version variiert; Gibt es einen Weg ohne Sessionen zu benutzen? –

+0

Ich verstehe Ihren Standpunkt nicht ganz, können Sie etwas ausarbeiten? –

+0

welchen Code möchten Sie – Rakin