VS加水晶报表一些问题让人真的很头疼,这里记录两个问题与大家共勉。
一、水晶报表首次启动慢,启动过一次后正常的问题。
这个问题确实存在,同时我相信地球人使用水晶报表的人都会遇到这个问题。引起这个问题的原因很多,Report.SetDataSource()是一个原因之一。目前有两个较好的两个步骤进行启动的优化。
Step one、不搜索打印机
图1
(来自博客http://*.com/questions/16662725/crystal-report-takes-long-time-to-load-every-time-in-vs2010)
按照这个方法,我们在设计器去把【打印机】项去掉。
图2
图3
在将图3的【取消格式设置页面大小和打印机纸张大小关联】项后,明显加载的速度提升了1-2秒。
如果不勾上面项,则是报表在搜索打印机的时间耗时了。进行上面一步,只是加速了一部分,还没达到更快的效果。
Step two、辅助线程中进行首次报表生成动作
因为报表确实存在首次生成时速度较快,后面的生成较快的现象。故可以在应用程序启动(或者其他空闲时间)的时候开启一个子线程来进行一次报表的初始化,后面真正要调用的时候就变成第二次调用了,这个就可以较好的解决上述问题了。
操作步骤如下:
(1)在某个地方开启线程初始化报表
-
Thread trdReport = new Thread(new ThreadStart(this.InitCrystalReport));
-
trdReport.Priority = ThreadPriority.BelowNormal;
- trdReport.Start();
(2)在线程处理函数中实现一次报表生成实例(不用show)
上面的InitCrystalReport()函数的作用是去crystalReportViewer所在的窗体(这里是ReportPrint)中初始化一次,当然不用show出来。
-
public void InitCrystalReport()
-
{
-
ReportPrint rPrint = new ReportPrint();
-
rPrint.JustTest();
- }
ReportPrint的JustTest()方法是去加载具体的报表模板生成一次。
-
public void JustTest()
-
{
-
MyReport myReport= new MyReport ();
-
ReportDocument document = (ReportDocument)myReport;
-
this.crystalReportViewer1.ReportSource = document;
- }
综上,便在后台神秘进行了一次报表生成工作,而这次生成的速度无论多慢帮应用程序来讲都没有一次影响,从而达到提升启动性能的效果。
二、报表设计的线条、框微调问题
图4
上图4中的线程和方框如何让它们准确的左右一致呢?用鼠标调和键盘上下左右键调节是作用不大的,各位可以亲自试试。
真正的窍门在这里:
图5 方框的Position
要想两者左右对齐,只需要将两者的Left,Right设置相同就Ok了。非常吻合!
Bottom及Top为同样道理。