2015-07-21 13 views
9

Mam wiele list Crystal Reports w liście wyboru, dzięki czemu użytkownik może drukować/wyświetlać wiele raportów w tym samym czasie.Pokaż wiele raportów Crystal w pętli

Obecnie używam sesji do przekazania raportu, ale przez większość czasu wartość sesji jest zastępowana przed przypisaniem do raportu kryształu, w wyniku czego wiele raportów zawiera te same dane. Zastosowałem 3-sekundowe opóźnienie w każdej pętli, ale nie jest to niezawodne rozwiązanie. Ponadto obraz nie wyświetla się w raportach.

Czy istnieje jakaś elegancka technika, aby to zrobić?

Lub

Co będzie alternatywą dla zmiennej sesji?

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

Kontroler:

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

Odpowiedz

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

Kontroler:

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

Bez sesji:

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

do wyświetlania obrazu dodać plik aspx Crysta lImageHandler.aspx w folderze, w którym istnieje plik Viewer.aspx. dodać również

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

    </httpHandlers> 

w Weconfig ... Numer wersji różni się w zależności od wersji crystalreport

+0

Dzięki za sugestię; Czy jest jakiś sposób bez korzystania z sesji? –

+0

Nie do końca rozumiem, czy możesz nieco wymyślić? –

+0

który kod chcesz opracować – Rakin

Powiązane problemy