当asp.net页面关闭时,如何释放Crystal Report对象

时间:2013-10-18 21:12:55

标签: asp.net crystal-reports-2010

我有一个使用Crystal Reports for Visual Studio 2010的asp .net 3.5应用程序。

我的报告预览屏幕出现问题。

如果我没有在页面中处理报告对象,则卸载对象保持活动状态,并且在网站的应用程序池被回收之前永远不会消失。此外,此时不会清除报告创建的临时文件。

如果我以卸载形式处理报表对象,则会释放该对象并删除临时文件。

但是,如果我这样做,那么报告对象就会消失,如果用户选择导出报告的选项(来自仍然打开的页面上的查看器控件),我会收到错误:

not set to an instance of on object

在我的ReportViewer页面中,我只有查看器控件。

在页面加载中,我创建报表对象并将其传递给查看器。这一切都很有效。

我的处理代码是一个处理MyBase.Unload的方法,现在我的问题是即使页面没有关闭也会触发此事件,我无法找到类似结束事件的事件在正常的窗户上。

我需要做些什么来妥善处理报告对象,但直到观察者实际关闭之后才能这样做?

3 个答案:

答案 0 :(得分:0)

我终于找到了解决这个问题的答案。

这只能通过使用脚本和一些额外代码来实现

在报表查看器的.aspx文件中,我必须添加脚本和onunload调用

<script language="javascript" type="text/javascript" >
    function cleanupCR() {
        __doPostBack('', 'DisposeOfCR');
        }
</script>

<body onunload="cleanupCR()">

然后在报告中查看.aspx.vb文件我修改了我的帖子回捕到handel处理水晶报告对象

If Me.IsPostBack Then
    rpt = Session(Me.HIDDENRPTKEY.Value)
    CrystalReportViewer1.ReportSource = rpt
    If (Me.Request.Params("__EVENTARGUMENT") = "DisposeOfCR") Then
        DisposeOfReportObject()
    End If
    Return
End If

最后在同一个i中添加了处理报表对象的方法:

If rpt IsNot Nothing Then
    Try
        If rpt.Database IsNot Nothing Then
            rpt.Database.Dispose()
        End If
    Catch
    End Try
    rpt.Close()
    rpt.Dispose()
End If

如果报告数据库对象无效,则rpt.Database测试将抛出错误,现在我只是将空捕获放在那里以允许这样做。我将不得不找到测试该值的正确方法,这样就不会产生错误。

答案 1 :(得分:0)

为什么不写

Report.Close();
Report.Dispose();
Page_Unload?

中的

这也将清除它们,你可以使用它们直到它们的时间(导出它们等)。 它在我的工作结束。

答案 2 :(得分:0)

      private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose(); //context means your crystal report document object.
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }