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

当asp.net页面关闭时,如何释放Crystal Report对象,asp.net,crystal-reports-2010,Asp.net,Crystal Reports 2010,我有一个使用Crystal Reports for Visual Studio 2010的asp.net 3.5应用程序 我对报告预览屏幕有问题 如果我不在页面卸载中处理report对象,该对象将保持活动状态,并且在回收站点的应用程序池之前不会消失。此外,该报告创建的临时文件也不会在此时清理 如果我在表单卸载中处理了报表对象,则会释放该对象并删除临时文件 但是如果我这样做,那么报告对象就消失了,如果用户选择导出报告的选项(从仍然打开的页面上的查看器控件),我会得到错误: not set to a

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

我对报告预览屏幕有问题

如果我不在页面卸载中处理report对象,该对象将保持活动状态,并且在回收站点的应用程序池之前不会消失。此外,该报告创建的临时文件也不会在此时清理

如果我在表单卸载中处理了报表对象,则会释放该对象并删除临时文件

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

not set to an instance of on object
在我的ReportViewer页面中,我只有查看器控件

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

我的处理代码是一种处理MyBase.Unload的方法,目前我的问题是,即使页面未关闭,也会触发此事件,并且我找不到与正常窗口上的关闭事件类似的事件


我需要做什么才能正确处理报表对象,但必须在查看器实际关闭后才能执行?

我终于找到了这个问题的正确答案

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

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

<script language="javascript" type="text/javascript" >
    function cleanupCR() {
        __doPostBack('', 'DisposeOfCR');
        }
</script>
最后,在同一个示例中,我添加了处理报表对象的方法:

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
如果report数据库对象无效,rpt.database测试将抛出一个错误,现在我只是将空的catch放在那里,以允许这样做。我必须找到正确的方法来测试该值,这样它就不会抛出错误。

为什么不编写

Report.Close();
Report.Dispose();
在页面中,你要卸载吗

这也将清除它们,您可以一直使用它们(导出它们等)。
这在我这边很管用。

也谢谢你的编辑,这让它看起来好多了
      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);
        }
Report.Close();
Report.Dispose();
      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);
        }