水晶报表——小代码,大作用(转自8miu,阿泰)

it2022-05-05  112

在前面的文章中,我一直是用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;       }     }

转载于:https://www.cnblogs.com/vibratea/archive/2010/09/15/1826822.html


最新回复(0)