2009-08-27 54 views
13

Tengo un control Crystal Report Viewer en una página aspx, que se supone que tiene una función de paginación.Crystal Reports Viewer no irá más allá de la página 2

Al hacer clic en el botón "página siguiente" la primera vez, me muevo de la página 1 a la página 2, pero todas las otras veces que haga clic en "página siguiente", el informe vuelve a cargar a la página 2.

+0

Publica tu ReportViewer de código subyacente para obtener ayuda útil! –

Respuesta

22

El problema puede se deriva de configurar el control de Crystal Report Viewer ReportSource durante el evento Page_Load. Esto hace que la información de paginación se sobrescriba con cada carga de página, por lo que la "página actual" se restablece a 1 cuando debería estar en 2.

Como una solución fácil, puede mover el código que establece ReportSource en Page_Init

+0

¡Muchas gracias! – Slovo

+0

Pasar a Page_Init resuelve el problema, pero ahora tengo un problema al cerrar su fuente de informes. Me gustaría llamar a estos métodos report.Close(); report.Dispose(); Pero no puedo llamarlos durante Page_Init. Sin cerrar las conexiones, recibo este error después de que los usuarios usan el informe por un tiempo: Excepción de Crystal Reports: se alcanzó el límite máximo de trabajos de procesamiento de informes configurado por el administrador del sistema – stillsmallvoice

+0

@stillsmallvoice Use un campo para el origen del informe en lugar de un local variable, y deséchelo en la página 'Deshacer()' anular. –

0

tuve ese problema antes de visual Studio 2008, cristal de la instalación de informes de paquete de servicio básico 1 resuelve el problema

0

tuve ese problema, compruebe si no hay otra WebControl interferir con Crystal (problema de devolución de llamada ? JavaScript? No estoy seguro). En mi caso específico, Dart File Upload y Crystal no se llevaban bien cuando se ponían en la misma página.

4
if (!Page.IsPostBack) 
{ 
    //Write your Report display code 

    crystalRep.Load(Server.MapPath("DueFD.rpt")); 
    crystalRep.SetDatabaseLogon(DB_UId, DB_Pass, Serv_Name, DB_Name); 
    CrystalReportViewer1.ReportSource = crystalRep; 

    // session code 
    ReportDocument doc = (ReportDocument)Session["ReportDocument"]; 
    CrystalReportViewer1.ReportSource = doc; 
} 
else 
{ 
    ReportDocument doc = (ReportDocument)Session["ReportDocument"]; 
    CrystalReportViewer1.ReportSource = doc; 
} 
5

añadir manualmente el evento Page_Init() y el alambre hacia arriba en la InitializeCompnent() con

this.Init += new System.EventHandler(this.Page_Init). 

mover el contenido de Page_Load-Page_Init().

Agregue if (!IsPostBack) condición en PageInIt.

protected void Page_Init(object sender, EventArgs e) { 

    if (!IsPostBack) 
    { 
     ReportDocument crystalReportDocument = new ReportDocumment(); 
     crystalReportDocument.SetDataSource(DataTableHere); 
     _reportViewer.ReportSource = crystalReportDocument; 
     Session["ReportDocument"] = crystalReportDocument; 
    } 
    else 
    { 
      ReportDocument doc = (ReportDocument)Session["ReportDocument"]; 
      _reportViewer.ReportSource = doc; 
    } 
} 
+0

Gracias., La mejor respuesta. – Ramunas

0

Puse todo el informe de carga en Page_Init en vez de Page_Load. Y funciona correctamente

0

Para mí esto funcionó bien hasta que actualicé de 13.0.1 a 13.0.10, así que claramente algo cambió.

He intentado con la solución anterior pero es complicada por el hecho de que publicamos nuevamente para actualizar los parámetros del informe, y si no configura los parámetros del informe en la carga de la página, la actualización falla. Por lo tanto, a partir de hoy no lo tengo funcionando sin tener algo en la carga de la página.

Sospecho que podría tener que agregar algo de lógica para verificar los valores de param modificados y solo actualizar el informe si se ha modificado.

1

Deja informe de origen en Page_Init en lugar de Page_Load Y PARÁMETROS DE LA MEMORIA Load creo que funciona Probablemente

1

Funciona para mí !!

ReportDocument rd = new ReportDocument(); 

     protected void Page_Load(object sender, EventArgs e) 
     {   
      string rptpath = WebConfigurationManager.AppSettings["ReportPath"].Replace("{TID}", Convert.ToString(Session["TID"])); 
      rd.Load(rptpath); 

      DataTable dtable = TemplateModel.LoadChequeData(Convert.ToString(Session["CID"])); 
      rd.SetDataSource(dtable);   
     } 

     protected void Page_Init(object sender, EventArgs e) 
     { 
      CrystalReportViewer1.ReportSource = rd; 
     } 
0

Tengo un enfoque para compartir. Desarrollé el envoltorio CR simple que puede ayudar a renderizar Crystal Reports. Use este código como está. Por favor, siéntase libre de modificar, ampliar cualquier parte del código. Enlace de descarga https://1drv.ms/u/s!AlTLBrnU_bLUiaoUxcxNiRCZRQjWng

Y la muestra de cómo utilizar el envoltorio utilizando la clase de envoltorio CR que enter code here implementa la interfaz IDisposable.Establezca el origen del informe en Page_Init e informe los parámetros en los eventos Page_Load y deseche el documento del informe en el evento Page_Unload.
El segundo método usa una clase estática y representa el informe en unos, descartando el documento de informe al final. El origen del informe debe guardarse en la variable de sesión. Tenga en cuenta que el segundo método no es realmente adecuado en la aplicación web de alto tráfico, porque el uso de la clase estática. La colisión ocurrirá si dos usuarios ejecutan cualquier informe al mismo tiempo.

Método 1

using System; 
using System.Linq; 
using CrystalDecisions.Shared; 
using System.Configuration; 
using System.Web.Configuration; 
using WebReports.Models.Helpers.CrystalReports; //Reference to CR wrapper 


namespace YourNamespace 
{ 
    public partial class ReportForm : System.Web.UI.Page 
    { 

     protected string _serverName; 
     protected string _databaseName; 
     protected string _schemaName; 
     protected string _userId; 
     protected string _userPassword; 
     protected bool _integratedSecurity; 
     protected string _databaseType; 
     //Wrapper Report Document 
     protected CReportDocument _reportDocument; 

     /// <summary> 
     /// Load report 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     protected void Page_Init(object sender, EventArgs e) 
     { 
      //Wrapper object 
      this._reportDocument = new CReportDocument(); 

      //These settings should be initialized from i.e. web.config in Page_PreInit 

      this._reportDocument.ServerName = this._serverName; 
      this._reportDocument.DatabaseName = String.Empty; 
      this._reportDocument.SchemaName = this._schemaName; 
      this._reportDocument.DatabaseType = CReportDatabaseType.ORACLE; 
      this._reportDocument.UserId = this._userId; 
      this._reportDocument.UserPassword = this._userPassword; 
      this._reportDocument.IntegratedSecurity = false; 


      //Get report name from query string. Define Your own method to get report name 
      var parReportName = Request.QueryString["reportname"]; 

      if (String.IsNullOrEmpty(parReportName)) 
      { 
       lblConfigError.Text = "Crystal Report name is not being provided."; 
       return; 
      } 

      //Set Report file 
      this._reportDocument.ReportFile = Server.MapPath("~/ReportFiles/") + parReportName; 
      //Set Report documant 
      this._reportDocument.SetReportDocument(); 
      //Get Report Document 
      crViewer.ReportSource = this._reportDocument.GetReportDocument(); 

     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 

      CReportParameter reportParameter; 

      //Get parameters Your own method to provide report parameters 
      var parFimYear = RouteData.Values["par1"]; 
      var parFimCityCode = RouteData.Values["par2"]; 

      if (par1 == null || par2 == null) 
      { 
       lblConfigError.Text = "Crystal Report parameters are not being provided."; 
       return; 
      } 

      //Define Report Parameter 
      reportParameter = new CReportParameter(); 
      reportParameter.ParameterName = "@parYear"; 
      reportParameter.ParameterValue = parFimYear; 
      reportParameter.crParameterValueKind = ParameterValueKind.StringParameter; 
      _reportDocument.AddCReportParameter(reportParameter); 

      reportParameter = new CReportParameter(); 
      reportParameter.ParameterName = "@parCityCode"; 
      reportParameter.ParameterValue = parFimCityCode; 
      reportParameter.crParameterValueKind = ParameterValueKind.StringParameter; 
      _reportDocument.AddCReportParameter(reportParameter); 

      //Set report parameters 
      this._reportDocument.SetReportParameters(); 

     } 

     protected void Page_Unload(object sender, EventArgs e) 
     { 
      this._reportDocument.Dispose(); 
     } 

    } 
} 

Método 2

using System; 
using System.Linq; 
using CrystalDecisions.Shared; 
using System.Configuration; 
using System.Web.Configuration; 
using CrystalDecisions.CrystalReports.Engine; 
using WebReports.Models.Helpers.CrystalReports; //Reference to CR wrapper 

namespace YourNamespace 
{ 
    public partial class ReportForm : System.Web.UI.Page 
    { 

     protected string _serverName; 
     protected string _databaseName; 
     protected string _schemaName; 
     protected string _userId; 
     protected string _userPassword; 
     protected bool _integratedSecurity; 
     protected string _databaseType; 

     /// <summary> 
     /// Load report 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     protected void Page_Init(object sender, EventArgs e) 
     { 
      CReportParameter reportParameter; 

      //These settings should be initialized from i.e. web.config in Page_PreInit 

      if (!IsPostBack) 
      { 
       if (this._databaseType == CReportDatabaseType.ORACLE.ToString()) 
       { 
        //static wrapper class 
        CReportDocumentManager.ServerName = this._serverName; 
        CReportDocumentManager.DatabaseName = String.Empty; 
        CReportDocumentManager.SchemaName = this._schemaName; 
        CReportDocumentManager.DatabaseType = CReportDatabaseType.ORACLE; 
        CReportDocumentManager.UserId = this._userId; 
        CReportDocumentManager.UserPassword = this._userPassword; 
        CReportDocumentManager.IntegratedSecurity = false; 

        //Get report name from query string. Define Your own method to get report name 
        var parReportName = Request.QueryString["reportname"]; 

        if (String.IsNullOrEmpty(parReportName)) 
        { 
         lblConfigError.Text = "Crystal Report name is not being provided."; 
         return; 
        } 
         //get par1. Your own method to provide report parameters. This is from MVC application 
         var par1 = RouteData.Values["par1"]; 
         //get par2 
         var par2 = RouteData.Values["par2"]; 

         if (par1 == null || par2 == null) 
         { 
          lblConfigError.Text = "Crystal Report parameters are not being provided."; 
          return; 
         } 

         reportParameter = new CReportParameter(); 
         reportParameter.ParameterName = "@parYear"; 
         reportParameter.ParameterValue = par1; 
         reportParameter.CReportParameterValueKind = ParameterValueKind.StringParameter; 
         CReportDocumentManager.AddCReportParameter(reportParameter); 

         reportParameter = new CReportParameter(); 
         reportParameter.ParameterName = "@parCityCode"; 
         reportParameter.ParameterValue = par2; 
         reportParameter.CReportParameterValueKind = ParameterValueKind.StringParameter; 
         CReportDocumentManager.AddCReportParameter(reportParameter); 



        CReportDocumentManager.ReportFile = Server.MapPath("~/ReportFiles/") + parReportName; 
        ReportDocument doc = CReportDocumentManager.GetCReportDocument(); 
        crViewer.ReportSource = doc; 
        Session[parReportName] = doc; 

       } 
      } 
      else 
      { 
       var parReportName = Request.QueryString["reportname"]; 
       ReportDocument doc = (ReportDocument)Session[parReportName]; 
       crViewer.ReportSource = doc; 

      }     
     } 

    } 
} 
Cuestiones relacionadas