当asp.net页面关闭时,如何释放Crystal Report对象
我有一个使用Crystal Reports for Visual Studio 2010的asp.net 3.5应用程序 我对报告预览屏幕有问题 如果我不在页面卸载中处理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
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);
}