循环显示多个 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 版本而异
我在复选框列表中有多个 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 版本而异