舞步者

带她一起去周游世界
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

水晶报表的分段加载及页面等待提示

Posted on 2008-04-25 22:45  Kevin_Zhang  阅读(715)  评论(0)    收藏  举报

用过水晶报表的人大概都有这么一个印象:水晶报表在第一次加载的时候,速度不尽如人意,随后,加载速度就正常了,那么在加载填充并打开报表的时候,可以把这些操作放在2个页面(报表选择和报表展现)中来执行,比如选择页面负责开辟线程预加载报表并填充数据,并将报表实力放进Session,在报表显示页面获取这个Session,并用报表查看器展现出来,另外还需要做的是可以通过一个等待页面来通知用户页面正在处理,让页面人性化。
1.等待页面 wait.htm

<script language="javascript">
function clearDiv()
{
    document.getElementById("waitbar").style.display='none';
}
</script>
<html >
<head>
    <title>无标题页</title><link type="text/css" href="../Images/style1.css" rel="stylesheet" />
</head>
<body>
    <div style="width: 197px; height: 18px" id="waitbar">
    <font size=2><img src="../RptSrc/wait.gif" />Loading Report,Please Wait...</font> </div>

</body>
</html>


2.报表选择页面ChooseRpt.aspx(程序片段)
一.page_load 开始:
        string strFileName = Path.Combine(Server.MapPath("."), "wait.htm");
        StreamReader sr = new StreamReader(strFileName, System.Text.Encoding.Default);
        string strHtml = sr.ReadToEnd();
        Response.Write(strHtml);
        sr.Close();
        Response.Flush();


二.page_Load末尾
    System.Threading.Thread tr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ReloadRpt));//new          
    System.Threading.ThreadStart(ReloadRpt)
        tr.Start(reloadRpt);
        tr.Join();
这里主线程会等待tr线程执行完毕,在等待的过程中,页面显示的则是第一步输入到页面的wait.htm的内容;tr线程则是进行报表的加载和填充数据的操作
   public void ReloadRpt(object rptaddr)
{
    //
      loading crystalreport and set datasource,and  save the ReportDocument instance into Session
    //
   
      /*-----------------------work has been finished,clear the waiting prompt
        string strScript = "<script>clearDiv();</script>";
        Response.Write(string.Format(strScript));
        Response.Flush();
      --------------------------*/
  
}
一个细节,就是,为使页面更协调,将wait.htm和报表装载页面的风格做成一致,这样用户就感觉不到有两个页面,原因就是我们在报表装载页面中用程序输出了
wait.htm的内容