RDLCレポートを読み込むaspxページがあります。
ポストバックでレポートを読み込むと(つまり、何もせずにページをポストしてDoReport()メソッドを呼び出すページにボタンを追加すると)、レポートは正常に読み込まれます。しかし、ページロード時に直接レポートをロードしようとすると(つまり、PageRoadにDoReport()メソッドを置くと、ページは無限に実行されているように見え、Page_Loadは何百回も呼び出されます)。
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.QueryString["ReportID"]))
{
BuildReport(Convert.ToInt32(Request.QueryString["ReportID"]));
}
}
private void BuildReport(int reportID_)
{
Database db = DatabaseFactory.CreateDatabase();
DataTable tbl = db.ExecuteDataSet(CommandType.Text, "select top 10 * from TABLE_NAME").Tables[0];
RdlcBuilder rdlcBuilder = new RdlcBuilder(reportID_); //custom class that builds the RDLC based on the report ID
XmlDocument xmlDoc = new XmlDocument();
Bind(rdlcBuilder.GetRdlcStream(xmlDoc), tbl);
}
private void Bind(Stream reportDefinitionStream_, DataTable dataSource_)
{
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.Width = new Unit(700);
ReportViewer1.Height = new Unit(1200);
ReportViewer1.LocalReport.EnableExternalImages = true;
ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetName", dataSource_));
ReportViewer1.LocalReport.LoadReportDefinition(reportDefinitionStream_);
}
再び – このページは、コマンドボタンからBuildReport(int
reportID_)を呼び出すと正常に動作します
ベストアンサー
レポート定義をレポートに割り当てると、ReportViewerが非同期的に読み込まれたときに([読み込み中]シンボルが表示されているときに)、別のPage_Loadがトリガーされます。
すべてのPage_Load内でレポート定義を割り当てるので、コードは間接的にPage_Loadを再帰的に呼び出します。
簡単な修正は、IsPostBackのチェックを実行することです。
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
return;
//...
//Assign report definition.
//...
}