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