水晶报表首次启动慢解决方案及表内框线微调设计方法

    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)在某个地方开启线程初始化报表


  1. Thread trdReport = new Thread(new ThreadStart(this.InitCrystalReport));
  2. trdReport.Priority = ThreadPriority.BelowNormal;
  3. trdReport.Start();


(2)在线程处理函数中实现一次报表生成实例(不用show)

    上面的InitCrystalReport()函数的作用是去crystalReportViewer所在的窗体(这里是ReportPrint)中初始化一次,当然不用show出来。


  1. public void InitCrystalReport()
  2. {
  3.     ReportPrint rPrint = new ReportPrint();
  4.     rPrint.JustTest();
  5. }


    ReportPrint的JustTest()方法是去加载具体的报表模板生成一次。


  1. public void JustTest()
  2. {
  3.     MyReport myReport= new MyReport ();
  4.     ReportDocument document = (ReportDocument)myReport;
  5.     this.crystalReportViewer1.ReportSource = document;
  6. }


    综上,便在后台神秘进行了一次报表生成工作,而这次生成的速度无论多慢帮应用程序来讲都没有一次影响,从而达到提升启动性能的效果。

 

二、报表设计的线条、框微调问题

水晶报表首次启动慢解决方案及表内框线微调设计方法

图4

    上图4中的线程和方框如何让它们准确的左右一致呢?用鼠标调和键盘上下左右键调节是作用不大的,各位可以亲自试试。

    真正的窍门在这里:

水晶报表首次启动慢解决方案及表内框线微调设计方法

图5 方框的Position

    要想两者左右对齐,只需要将两者的Left,Right设置相同就Ok了。非常吻合!

    Bottom及Top为同样道理。

上一篇:QtGUI Module's Classes


下一篇:解决在onCreate()过程中获取View的width和Height为0的4种方法