Crystal Reports Viewer не будет проходить мимо страницы 2

У меня есть элемент управления Crystal Report Viewer на странице aspx, который должен иметь встроенный пейджинг.

Когда я нажимаю кнопку "следующая страница" в первый раз, я перехожу со страницы 1 на страницу 2, но каждый раз, когда я нажимаю "следующая страница", отчет перезагружается на страницу 2.

Ответы

Ответ 1

Проблема может быть связана с настройкой элемента управления Crystal Report Viewer ReportSource во время события Page_Load. Это приводит к перезаписи пейджинговой информации при каждой загрузке страницы, поэтому "текущая страница" повторно установлена ​​на 1, когда она должна быть на 2.

В качестве простого решения вы можете переместить код, который устанавливает ReportSource в Page_Init

Ответ 2

Вручную добавьте событие Page_Init() и подключите его в InitializeCompnent() с помощью

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

Переместите содержимое Page_Load на Page_Init().

Добавить if (!IsPostBack) условие в 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;
    }
}

Ответ 3

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;
}

Ответ 4

Поместите источник отчета в Page_Init вместо Page_Load И параметры отчета Page_Load Я думаю, что это работает Вероятно

Ответ 5

Это работает для меня!

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;
        }

Ответ 6

У меня была эта проблема до Visual Studio 2008, установка хрустальных отчетов основной пакет обновления 1 решила проблему

Ответ 7

У меня тоже была проблема, проверьте, нет ли другого WebControl, мешающего Crystal (проблема обратного вызова? JavaScript? Я не уверен). В моем конкретном случае Dart File Upload и Crystal не хорошо ладили, когда ставили на ту же страницу.

Ответ 8

Я поместил весь отчет о загрузке в Page_Init вместо Page_Load. И он работает правильно.

Ответ 9

Для меня это работало нормально, пока я не обновился с 13.0.1 до 13.0.10, поэтому явно что-то изменилось.

Я пробовал вышеупомянутое решение, но это осложнялось тем фактом, что мы отправляем назад параметры обновления отчета, и если вы не устанавливаете параметры отчета при загрузке страницы, обновление не выполняется. Итак, на сегодняшний день я не работал, не имея чего-то в загрузке страницы.

Я подозреваю, что мне, возможно, придется добавить некоторую логику, чтобы проверить измененные значения параметров и обновить отчет только если он изменился.

Ответ 10

У меня есть некоторый подход к совместному использованию. Я разработал простую оболочку CR, которая может помочь в создании Crystal Reports. Используйте этот код как есть. Не стесняйтесь изменять, расширять любую часть кода. Ссылка для скачивания https://1drv.ms/u/s!AlTLBrnU_bLUiaoUxcxNiRCZRQjWng

И пример использования оболочки с использованием класса обертки CR, который enter code here реализует интерфейс IDisposable. Задайте источник отчета в параметрах Page_Init и отчетах в событиях Page_Load и удалите отчет в событии Page_Unload.
Второй метод использует статический класс и отображает отчет в единицах, удаляя документ отчета в конце. Источник отчета должен быть сохранен в переменной сеанса. Помните, что второй метод не очень подходит для веб-приложения с высоким трафиком, поскольку используется статический класс. Столкновение произойдет, если два пользователя будут запускать любые отчеты одновременно.

Способ 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();
        }

    }
}

Способ 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;

            }                
        }

    }
}