水晶报表心得

在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
既然是状态丢失,那么我们可以用.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) 
        {
         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 estall.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里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。
二是可能会多次请求数据库,导致资源的消耗。

原文地址:https://www.cnblogs.com/likeyou/p/3169503.html