这是我暂时采用的一个方案,比较丢人。。。。。。。。。。。。。。。。。。。
各位好:
我用Crystal Report做报表,在win2000下一切正常,但在win98下
使用出现了一系列问题。
我的代码思路如下:
//---------------------------------------------------------
---------------------------------------------------
ReportDocument rdoc=new ReportDocument();
MyDataSet wdata=GetMyDataSet(…);//MyDataSet继承
自DataSet,这里得到要打印的数据集的实力。
rdoc.SetDataSource(wdata);
rdoc.PrintOptions.PaperOrientation=CrystalDecisions.Shared.
PaperOrientation.Portrait;
try
{
if(isPreview)//决定是否预览
{
FrmPrint frm=new FrmPrint();
//这
是个打印预览窗口,其中有个crystalReportViewer组建,
frm.RepDoc=rdoc;
//传过reportDocument
去,并在Frm_active事件中为crystalReportViewer.ReportSource
赋值。
frm.ShowDialog();
}
else
{
rdoc.PrintToPrinter(1,true,0,0);
}
}
except
{
//显示错误
}
下面是出现的问题。
1.进行预览时(isPreview=true),第一次出现错误“查询引擎错
误”。第二次执行正常
2.进入预览窗口,点击CrystalReportViewer自带的的打印按钮,
出现打印设置对话框,点击确定,出现“未将引用设置到对象实
例”,多次点击执行这个打印步骤,总能有一次成功。
3.在进入预览窗口,和关闭调用预览窗口的窗口时,也曾出现“除
数为零”,“0不能做索引”两个错误。(这另个错误可能不和
Cystal 直接有关)
4.不预览直接打印(isPreview=flase),可以正常打印,但所有
半角字符(空格、括号、冒号)后面的第二个全角字符主动上前把
第一个全角字符压注了一半,难看。
(以上问题在win2000下一切OK)
下面是我试图解决的方法。
1.对于第一个问题。网上找到了相应连接
http://support.crystaldecisions.com/forums/message.asp?
fid=71&sk=36&ps=25&pn=1&mid=57289
我将msvcp70.dll,拷贝到98的System目录下,重新注册时未成功
(regsve32).
2.对于第二个问题
我的直觉是,win2000(xp)为framework中的某个类进
行了应有的实例化,但win98没有。有关资料解释,不要用
printContorlerWithDtatusDialog,而用
StandardPrinterControler,但题目是针对System.Drawing.Printer
命名空间的,对Crystal Report如何处理呢,
crystalReportPreview中是否存在类似的PrintControler的属性
呢?
http://dotnet247.com/247reference/msgs/26/133141.aspx
3.对于第四个问题,应该和Unicode有关,我从ms网站上DOWN下
unicows.exe,但其中的unicows.dll还是注册不上(regsve32, 和
上面的注册一样,它们已经有个实例在运行了,我怎样才能重新注
册?)
http://support.crystaldecisions.com/forums/message.asp?
fid=71&sk=5&ps=25&pn=1&mid=77661#m77661
下面是我的丢人解决办法:
1.对于第一个问题我把我的调用预览窗口的代码(上面显示了)放
在一个循环里,只要有异常出现,为打印成功,就再循环一次,直
到成功。这样就把第一个问题屏蔽了。
2.我在预览窗口中填加我自己的打印按钮,并把
CrystalReprotViewer的打印按钮关了,下面是打印事件
try
{
this.crystalReportViewer.ReportSource=this.repDoc
;
//本来以为是这个实例为初始化,看来不是
this.crystalReportViewer.PrintReport();
}
catch
{
//事实上,这里得不到打印异常,打印异常在
crystalReportView的HandleException的事件里。
}
//订阅crystalReportView.HandleException事件
private void
crystalReportViewer_Exception(object
sender,CrystalDecisions.Windows.Forms.ExceptionEventArgs e)
{
e.Handled=true;
btnPrint_Click(null,null);//嘿嘿,累死你
}
这样的话,异常不出现了,如果打印不成功,就再次调用打印按钮
的事件,就再次弹出打印对话框(crystal 把它封装在PrintReport
方法里了),再次确认,不行就再次循环,直到OK了。(这样处
理,确实太丢人了)
3.对于第四个问题,干脆不让用户直接打印(又一个丢
人的地方)
在16大的鼓舞下,在用户的苦苦相逼,在两天的绞尽脑汁,拿出了
如此的解决方案。各位给我指条明路。
--------------------------------------------------------------------------