用过水晶报表的人大概都有这么一个印象:水晶报表在第一次加载的时候,速度不尽如人意,随后,加载速度就正常了,那么在加载填充并打开报表的时候,可以把这些操作放在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的内容
浙公网安备 33010602011771号