Загрузить RDLC на page_load - PullRequest
       7

Загрузить RDLC на page_load

1 голос
/ 13 ноября 2011

У меня есть страница aspx, которая загружает отчет RDLC.

Когда я загружаю отчет в ответном сообщении (то есть, добавляя кнопку на страницу, которая ничего не делает, только публикует страницу назад и вызывает метод DoReport ()), отчет загружается нормально. Однако, если я пытаюсь загрузить отчет непосредственно при загрузке страницы (т.е. я помещаю метод DoReport () в Page_Load, кажется, что страница работает бесконечно, и 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_) из командной кнопки

1 Ответ

1 голос
/ 06 июня 2012

Присвоение определения отчета отчету вызывает другой Page_Load, когда ReportViewer асинхронно заполняется (пока отображается символ «загрузки»).

Поскольку вы назначаете определение отчета для каждой Page_Load, ваш код косвенно вызывает Page_Load рекурсивно.

Простое исправление - проверка IsPostBack:

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack)
        return;
    //...
    // Assign report definition.
    //...

}
...