我有一个使用Crystal Reports for Visual Studio 2010的asp .net 3.5应用程序。
我的报告预览屏幕出现问题。
如果我没有在页面中处理报告对象,则卸载对象保持活动状态,并且在网站的应用程序池被回收之前永远不会消失。此外,此时不会清除报告创建的临时文件。
如果我以卸载形式处理报表对象,则会释放该对象并删除临时文件。
但是,如果我这样做,那么报告对象就会消失,如果用户选择导出报告的选项(来自仍然打开的页面上的查看器控件),我会收到错误:
not set to an instance of on object
在我的ReportViewer页面中,我只有查看器控件。
在页面加载中,我创建报表对象并将其传递给查看器。这一切都很有效。
我的处理代码是一个处理MyBase.Unload
的方法,现在我的问题是即使页面没有关闭也会触发此事件,我无法找到类似结束事件的事件在正常的窗户上。
我需要做些什么来妥善处理报告对象,但直到观察者实际关闭之后才能这样做?
答案 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);
}