水晶报表客户端打印问题,困扰我N天了,急死了

iloveyoubaby 2009-06-23 02:16:33
开发环境:vs2005 +crystal report for vs2005 +sql 2000 +windowsxp
我的一个页面中有个Crystal Report,还有一些DropDownlist,用于客户端选择报表的参数,然后通过一个button的click事件给一个数据集填充数据,这个数据集是Crystal Report的数据源,现在水晶报表能正常根据通过Dropdownlist选择的参数来显示数据,问题是,水晶报表的导出和打印按钮,无效。点击这两个按钮,页面就刷新一次,没有其他表现,而且水晶报表显示的数据也消失了。请问怎么解决。
另外,怎么自定义水晶报表中导出和打印按钮的click事件
...全文
623 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
plummoon 2009-10-27
  • 打赏
  • 举报
回复
说的太好了,刚接触 以后多多学习
llsen 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 babyt 的回复:]
VS自带的版本默认75次打印任务,75次后可以重启IIS即可重新计数。

具体为修改注册表下面两个键的值。
[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\InProcServer]
修改"PrintJobLimit"="1000"

[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\Server]
修改"PrintJobLimit"="1000"

但是定期重启IIS是不可避免的,之前看到一些系统是每天晚…
[/Quote]

收藏
阿泰 2009-06-24
  • 打赏
  • 举报
回复
VS自带的版本默认75次打印任务,75次后可以重启IIS即可重新计数。

具体为修改注册表下面两个键的值。
[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\InProcServer]
修改"PrintJobLimit"="1000"

[HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\Server]
修改"PrintJobLimit"="1000"

但是定期重启IIS是不可避免的,之前看到一些系统是每天晚上系统空闲时会自动重启服务器的。

当然,最好是换成独立版本。如果是用户比较多的话。
llsen 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 iloveyoubaby 的回复:]
另外,请问一个问题,如果用vs2005自带的Crystal Reports for vs 2005 设计的报表进行网络部署的话,在Web中使用是不是有使用次数的限制,如果有,怎么破解
[/Quote]

记得有次看阿泰的回复,好像是修改注册表
默认好像是打印30次,修改注册表可以设置多的次数,比如1000
忘了在哪设了

等阿泰
llsen 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iloveyoubaby 的回复:]
问题是:

C# code
MyReport.PrintToPrinter(1, true, 0, 0);



这个好像是在服务器端的打印,而我需要客户端的打印,而且要实现可以选择IE客户端打印机的功能


C# code
myReport.ExportToDisk(ExportFormatType.PortableDocFormat, @"d:\ae0000.pdf");



这个也不能够让IE客户端自己选择文件保存地址
[/Quote]


MyReport.PrintToPrinter(1, true, 0, 0);

这样打印,在客户端也可以,只要连接的有打印机

导出的话,我的一般做法是导出到服务器上,然后提供下载
给你个下载方法
直接Response.Redirect("pdf的位置"); 貌似有些时候会打开,而不是提示保存
我一般是加一个download画面,然后代码里面写这些代码
导出成功后,然后跳转到这个画面,传地址参数

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using System.Reflection;
using System.Diagnostics;

public partial class WebForms_Hospital_Default :PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
string strPath = Request["Path"].ToString().Trim();
DownloadFile(Page.Response, strPath);
}
catch (Exception ex)
{
this.ShowMessage(ex.Message);
}
}

#region 下载服务器上的文件
/// <summary>
/// 下载服务器上的文件
/// </summary>
/// <param name="PageResponse">程序中可以设置参数:HttpResponse ht=Page.Response;</param>
/// <param name="serverPath">服务器上的文件路径</param>
public void DownloadFile(HttpResponse response, string serverPath)
{
FileStream fs = null;
try
{
fs = File.OpenRead(serverPath);
byte[] buffer = new byte[1024];
long count = 1024;
response.Buffer = true;
response.AddHeader("Connection", "Keep-Alive");
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(serverPath));//下载时要保存的默认文件名
response.AddHeader("Content-Length", fs.Length.ToString());
while (count == 1024)
{
count = fs.Read(buffer, 0, 1024);
response.BinaryWrite(buffer);
}
}
catch
{
}
finally
{
fs.Close();
}
}
#endregion
}
llsen 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 babyt 的回复:]


1:点打印和导出后页面数据丢失问题,因为每次操作都会重新连接数据源,所以要满足这个需要,我们采用缓存方案,防止多次连接数据库


C# code//将处理好的报表对象缓存
Session["myRpt"]=MyReport;
CrystalReportViewer1.ReportSource = MyReport;



然后在Page_Load事件里,增加代码段

C# codeif (Session["myRpt"]!=null)
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}…
[/Quote]

阿泰都帮你解决了


问题原因就是,你是在按钮点击的时候给报表绑定的值,
但是页面刷新后,执行的page_load,没有执行按钮单击事件,所以没有绑定值给报表。
也就无法显示数据

所以一般报表页面都是不加
isPostBack这个判断的
春天的气息 2009-06-24
  • 打赏
  • 举报
回复
看一下水晶报表的专题吧:
有实例下载。
http://www.bbs180.com/showforum-18.aspx
iloveyoubaby 2009-06-24
  • 打赏
  • 举报
回复
不好意思,麻烦您了
iloveyoubaby 2009-06-24
  • 打赏
  • 举报
回复
另外,请问一个问题,如果用vs2005自带的Crystal Reports for vs 2005 设计的报表进行网络部署的话,在Web中使用是不是有使用次数的限制,如果有,怎么破解
阿泰 2009-06-24
  • 打赏
  • 举报
回复
楼主应该事先声明这些条件,可以少一些往复。

公网打印,就只能用工具条了。
iloveyoubaby 2009-06-24
  • 打赏
  • 举报
回复
1:应该是说从服务器端发起的打印任务,这个可以打到任何一台服务器能连上的共享打印机上。
而且要做到选择,也是可以的。
myReport.PrintOptions.PrinterName = "打印机名称或\\打印机名称";
从这句看出,你可以指定目标打印机的,所以你可以做一个打印机列表,让用户去选。
这个做起来是有点麻烦,所以很多人会放弃这个方案,虽然这确实是个好的且被证明为有效的方案


这个做打印机列表好像不现实,因为我的用户是通过互联网来访问这个页面的,不可能实现客户端的打印机能够让网站服务器端共享打印,这个打印机的列表也无法建立,用户的IP地址是随机的,某些内网用户的代理服务器及防火墙都会有限制
阿泰 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iloveyoubaby 的回复:]
问题是:

C# code
MyReport.PrintToPrinter(1, true, 0, 0);


这个好像是在服务器端的打印,而我需要客户端的打印,而且要实现可以选择IE客户端打印机的功能

C# code
myReport.ExportToDisk(ExportFormatType.PortableDocFormat, @"d:\ae0000.pdf");

这个也不能够让IE客户端自己选择文件保存地址
[/Quote]

1:应该是说从服务器端发起的打印任务,这个可以打到任何一台服务器能连上的共享打印机上。
而且要做到选择,也是可以的。
myReport.PrintOptions.PrinterName = "打印机名称或\\打印机名称";
从这句看出,你可以指定目标打印机的,所以你可以做一个打印机列表,让用户去选。
这个做起来是有点麻烦,所以很多人会放弃这个方案,虽然这确实是个好的且被证明为有效的方案

2:让用户选保存路径,也是可以的,也有好几种方法
比如说,这句代码后面加上句: Response.Redirect("pdf的位置"); 用户就可以下载到本地了。
阿泰 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 iloveyoubaby 的回复:]
另外,为何水晶报表自带的ToolBar中的打印和导出的click事件会重新连接数据源呢
在一个“拖2个服务器端button”,这两Button并不是水晶报表自带的ToolBar中的打印和导出按钮。
而我的意思是能否自定义水晶报表自带的ToolBar中的打印和导出按钮的click事件
[/Quote]


1:HTTP是无状态的
2:基本上认为是不可以的。
当然,你可以尝试去修改水晶报表的工具条脚本,但是这样带来的问题是,脚本是通用的,你的一次修改可能会影响其他报表的打印等动作。
iloveyoubaby 2009-06-23
  • 打赏
  • 举报
回复
另外,为何水晶报表自带的ToolBar中的打印和导出的click事件会重新连接数据源呢
在一个“拖2个服务器端button”,这两Button并不是水晶报表自带的ToolBar中的打印和导出按钮。
而我的意思是能否自定义水晶报表自带的ToolBar中的打印和导出按钮的click事件
iloveyoubaby 2009-06-23
  • 打赏
  • 举报
回复
问题是:

MyReport.PrintToPrinter(1, true, 0, 0);

这个好像是在服务器端的打印,而我需要客户端的打印,而且要实现可以选择IE客户端打印机的功能


myReport.ExportToDisk(ExportFormatType.PortableDocFormat, @"d:\ae0000.pdf");

这个也不能够让IE客户端自己选择文件保存地址
阿泰 2009-06-23
  • 打赏
  • 举报
回复


1:点打印和导出后页面数据丢失问题,因为每次操作都会重新连接数据源,所以要满足这个需要,我们采用缓存方案,防止多次连接数据库

//将处理好的报表对象缓存
Session["myRpt"]=MyReport;
CrystalReportViewer1.ReportSource = MyReport;


然后在Page_Load事件里,增加代码段
if (Session["myRpt"]!=null) 
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}


2:自定义打印和导出事件

拖2个服务器端button,双击进入,编写事件即可。

打印你已经写了,就是
MyReport.PrintToPrinter(1, true, 0, 0);


但是要注意MyReport要获取好,可以考虑从前面的session里取

导出也类似
myReport.ExportToDisk(ExportFormatType.PortableDocFormat, @"d:\ae0000.pdf");

iloveyoubaby 2009-06-23
  • 打赏
  • 举报
回复
阿泰老师,帮我看看,这个怎么弄
阿泰 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iloveyoubaby 的回复:]
引用 3 楼 wave12 的回复:
用报表打印控件wsReport7.0 有在线技术支持
http://www.wave12.com/home.asp


这个要收费吗
[/Quote]

问到要害了,呵呵
iloveyoubaby 2009-06-23
  • 打赏
  • 举报
回复
上面的代码中倒数2-3是用来测试的。重发

//定义载入报表按钮Button_LoadReport的Click事件
protected void Button_LoadReport_Click(object sender, EventArgs e)
{
if (DropDownList_City.SelectedValue == "" || DropDownList_Company.SelectedValue == "" || DropDownList_Year.SelectedValue == "" || DropDownList_Month.SelectedValue == "")
{
Response.Write("<script language='javascript'>window.alert('请选择正确的城市、企业及年月');</script>");
}
else
{
GypPriceStatisticReport ReturnGypPriceStatisticReport = new GypPriceStatisticReport();
string ssdh = DropDownList_City.SelectedValue.Trim();
string qydh = DropDownList_Company.SelectedValue.Trim();
string StatisticTableID = DropDownList_StatisticReportName.SelectedValue.Trim();
string InputYearMonth = DropDownList_Year.SelectedValue.Trim() + DropDownList_Month.SelectedValue.Trim();
string GypYsDataTableName="";
if (StatisticTableID == "V201") //注意此处的V201的大小写要与数据库中的值一致
{
GypYsDataTableName = "GypCys";
}
else
{
GypYsDataTableName = "GypGys";
}

ReturnGypPriceStatisticReport = conn.GypGetStatisticReport(ssdh, qydh, StatisticTableID, "0001", InputYearMonth, GypYsDataTableName);

ReportDocument MyReport = new ReportDocument();
string ReportPath = Server.MapPath("../GypPrice/GypPriceStatisticReport.rpt");
MyReport.Load(ReportPath);

MyReport.SetDataSource(ReturnGypPriceStatisticReport);

//将报表中的年、月文本对象赋予DropDownList_Year和DropDownList_Month选择的值
((TextObject)MyReport.ReportDefinition.ReportObjects["Text_InputYear"]).Text = DropDownList_Year.SelectedValue.Trim();
((TextObject)MyReport.ReportDefinition.ReportObjects["Text_InputMonth"]).Text = DropDownList_Month.SelectedValue.Trim();

//CrystalReportViewer1.DataBind();
}
}
iloveyoubaby 2009-06-23
  • 打赏
  • 举报
回复

//定义载入报表按钮Button_LoadReport的Click事件
protected void Button_LoadReport_Click(object sender, EventArgs e)
{
if (DropDownList_City.SelectedValue == "" || DropDownList_Company.SelectedValue == "" || DropDownList_Year.SelectedValue == "" || DropDownList_Month.SelectedValue == "")
{
Response.Write("<script language='javascript'>window.alert('请选择正确的城市、企业及年月');</script>");
}
else
{
GypPriceStatisticReport ReturnGypPriceStatisticReport = new GypPriceStatisticReport();
string ssdh = DropDownList_City.SelectedValue.Trim();
string qydh = DropDownList_Company.SelectedValue.Trim();
string StatisticTableID = DropDownList_StatisticReportName.SelectedValue.Trim();
string InputYearMonth = DropDownList_Year.SelectedValue.Trim() + DropDownList_Month.SelectedValue.Trim();
string GypYsDataTableName="";
if (StatisticTableID == "V201") //注意此处的V201的大小写要与数据库中的值一致
{
GypYsDataTableName = "GypCys";
}
else
{
GypYsDataTableName = "GypGys";
}

ReturnGypPriceStatisticReport = conn.GypGetStatisticReport(ssdh, qydh, StatisticTableID, "0001", InputYearMonth, GypYsDataTableName);

ReportDocument MyReport = new ReportDocument();
string ReportPath = Server.MapPath("../GypPrice/GypPriceStatisticReport.rpt");
MyReport.Load(ReportPath);

MyReport.SetDataSource(ReturnGypPriceStatisticReport);

//将报表中的年、月文本对象赋予DropDownList_Year和DropDownList_Month选择的值
((TextObject)MyReport.ReportDefinition.ReportObjects["Text_InputYear"]).Text = DropDownList_Year.SelectedValue.Trim();
((TextObject)MyReport.ReportDefinition.ReportObjects["Text_InputMonth"]).Text = DropDownList_Month.SelectedValue.Trim();

MyReport.PrintToPrinter(1, true, 0, 0);
CrystalReportViewer1.ReportSource = MyReport;

//CrystalReportViewer1.DataBind();
}
}
加载更多回复(3)
Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!
1 安装方法: 此系统为测试版本,只是一个大体的框架,直接解压缩到c: ewsoft目录下即可,注意只能为此目录,且不能改变其目录结构,在正式版中将提供自动目录搜寻功能。 “newsoft”目录下为源文件。 “my”子目录中为系统的exe文件,双击即可运行。 “lib”子目录为系统存放类文件目录。 2 功能介绍: 对办公用品的购买,领取进行管理。 本系统可以设置用户权限,根据权限可以实现不同级别的操作; 系统初始密码为:超级用户:用户名、口令都为vip 一般用户:用户名、口令都为user 类别添加:添加所购物品分类,如钢笔、笔记本等; 部门添加:添加公司部门,还没有加上,有兴趣的朋友可以自己加上,方法与类别添加一样,表名为bm; 物品入库:采购来的物品应及时入库,若两次采购相同的物品,系统会自动计算其平均价格,并更新购买日期。注:此版本现只能计算平均成本和更新最后采购日期,但当有多个采购员是不能看出到底是谁进的货,有兴趣的朋友可以修改。 领用登记:领用办公用品后,应及时入库登记,系统会自动分摊费用,可以按月、季、年结帐分摊费用。注:设想改为到一定时期(如一个月),自动备份数据,打印报表,交财务分摊费用。 报表打印:可以按年、季、月或自定义一段时期打印报表。 更多功能正在完善中,可以来信与我交流。 3 系统说明 由于时间仓促,系统的详细说明教程还没有写,需要的朋友可以来信索取,等完成后我会发到您的信箱中。 4 意见反馈 由于近期要为公司开发一套办公管理软件(网络版),这是其中一个模块,希望您试用以后能给我一点意见。

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧