水晶报表——小代码,大作用(转自CSDN,阿泰)
2010-09-15 11:20
309 查看
在前面的文章中,我一直是用WebForm演示的,主要是因为 HTTP是无状态的,在此链接的操作,不会带到下一连接中。
所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。
二是可能会多次请求数据库,导致资源的消耗。
前面说到既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态。
这里我用session做一个范例,场景是这样的:
一个PUSH模式的报表,带一个参数p1.
界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。
其实只要改造两处地方即可,注意红色的部分。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//使用Session保持ReportDocument对像
//每次页面更新时,不再需要重新走数据库
//注意:如果是VS2008,这段代码要放到Page_Init事件中
If (Session["myRpt"]!=null) then
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}
}
//点击按钮后,报表进行第一次呈现
protected void Button1_Click(object sender, EventArgs e)
{
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
DataSet2 dt1 = new DataSet2();
da.Fill(dt1, "RPT_CR_TEST1");
ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath);
//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(dt1.Tables[0]);
myReport.SetParameterValue("p1","参数测试");
CrystalReportViewer1.ReportSource = myReport;
//保存到Session
Session["myRpt"]=myReport;
}
}
所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。
二是可能会多次请求数据库,导致资源的消耗。
前面说到既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态。
这里我用session做一个范例,场景是这样的:
一个PUSH模式的报表,带一个参数p1.
界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。
其实只要改造两处地方即可,注意红色的部分。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//使用Session保持ReportDocument对像
//每次页面更新时,不再需要重新走数据库
//注意:如果是VS2008,这段代码要放到Page_Init事件中
If (Session["myRpt"]!=null) then
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}
}
//点击按钮后,报表进行第一次呈现
protected void Button1_Click(object sender, EventArgs e)
{
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
DataSet2 dt1 = new DataSet2();
da.Fill(dt1, "RPT_CR_TEST1");
ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath);
//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(dt1.Tables[0]);
myReport.SetParameterValue("p1","参数测试");
CrystalReportViewer1.ReportSource = myReport;
//保存到Session
Session["myRpt"]=myReport;
}
}
相关文章推荐
- 水晶报表 小代码大作用【BY 阿泰】
- 阿泰,水晶报表--pull模式样板
- [转]水晶报表列太多导致设计界面容纳不下的解决方法 [http://blog.csdn.net/lupenda/archive/2005/08/12/452878.aspx]
- 水晶报表参数传递代码 同时 可以翻页
- 【转】如何使用代码动态设置水晶报表中的文本,字段等对象呢?
- [转]水晶报表参数编程示例代码[http://blog.csdn.net/xwdd129/archive/2006/05/29/760672.aspx]
- 水晶报表参数字段在代码中赋值
- 水晶报表参数编程示例代码
- 阿泰,水晶报表--推拉之间
- 水晶报表应用代码
- [转] 再谈水晶报表 (王智谈水晶报表系列2 附源码) [http://blog.csdn.net/sywangzhi/archive/2007/07/08/1682948.aspx]
- [转]c#编程更改水晶报表中公式字段示例代码 [http://blog.csdn.net/xwdd129/archive/2006/05/29/760661.aspx]
- 使用水晶报表自定义函数进行代码重用
- 水晶报表 代码控制记录排序专家
- 阿泰,水晶报表--push样式模板
- 使用eclipse在jsp上显示水晶报表(二)后台代码例子
- [转] 部署水晶报表时的常见问题及解决方案 [http://blog.csdn.net/ytbada/archive/2007/06/26/1666594.aspx]
- 水晶报表关键代码
- 水晶报表参数编程示例代码
- asp.net水晶报表参数字段在代码中赋值的方法