page_loadにRDLCをロードする

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.
    //...

}

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です